ZGlmZiAtLWdpdCBhL2phdmFfZ2VuL2NvZGVnZW4ucHkgYi9qYXZhX2dlbi9jb2RlZ2VuLnB5CmluZGV4IGYzNjE5ZDQuLmJjOWI5YTAgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL2NvZGVnZW4ucHkKKysrIGIvamF2YV9nZW4vY29kZWdlbi5weQpAQCAtMzcsNiArMzcsNyBAQAogZnJvbSBsb3hpX2lyIGltcG9ydCAqCiBpbXBvcnQgbGFuZ19qYXZhCiBpbXBvcnQgdGVzdF9kYXRhCitmcm9tIGltcG9ydF9jbGVhbmVyIGltcG9ydCBJbXBvcnRDbGVhbmVyCiAKIGltcG9ydCBsb3hpX3V0aWxzLmxveGlfdXRpbHMgYXMgbG94aV91dGlscwogCkBAIC04NCw2ICs4NSwxNCBAQAogICAgICAgICBwcmludCAiZmlsZW5hbWU6ICVzIiAlIGZpbGVuYW1lCiAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInciKSBhcyBmOgogICAgICAgICAgICAgbG94aV91dGlscy5yZW5kZXJfdGVtcGxhdGUoZiwgdGVtcGxhdGUsIFtzZWxmLnRlbXBsYXRlc19kaXJdLCBjb250ZXh0LCBwcmVmaXg9cHJlZml4KQorICAgICAgICAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xlYW5lciA9IEltcG9ydENsZWFuZXIoZmlsZW5hbWUpCisgICAgICAgICAgICBjbGVhbmVyLmZpbmRfdXNlZF9pbXBvcnRzKCkKKyAgICAgICAgICAgIGNsZWFuZXIucmV3cml0ZV9maWxlKGZpbGVuYW1lKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwcmludCAnQ2Fubm90IGNsZWFuIGltcG9ydHMgZnJvbSBmaWxlICVzJyAlIGZpbGVuYW1lCisgICAgICAgIAogCiAgICAgZGVmIGNyZWF0ZV9vZl9jb25zdF9lbnVtcyhzZWxmKToKICAgICAgICAgZm9yIGVudW0gaW4gc2VsZi5qYXZhX21vZGVsLmVudW1zOgpAQCAtMTI2LDEzICsxMzUsMTYgQEAKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBwcmludCAiQ2xhc3MgJXMgaWdub3JlZCBieSBnZW5lcmF0ZV9jbGFzcyIgJSBqYXZhX2NsYXNzLm5hbWUKIAotICAgIGRlZiBjcmVhdGVfdW5pdF90ZXN0KHNlbGYsIHVuaXRfdGVzdCk6Ci0gICAgICAgIGlmIHVuaXRfdGVzdC5oYXNfdGVzdF9kYXRhOgotICAgICAgICAgICAgc2VsZi5yZW5kZXJfY2xhc3MoY2xheno9dW5pdF90ZXN0LAotICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZT0ndW5pdF90ZXN0LmphdmEnLCBzcmNfZGlyPSJzcmMvdGVzdC9qYXZhIiwKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj11bml0X3Rlc3QuamF2YV9jbGFzcy52ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICB0ZXN0PXVuaXRfdGVzdCwgbXNnPXVuaXRfdGVzdC5qYXZhX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICB0ZXN0X2RhdGE9dW5pdF90ZXN0LnRlc3RfZGF0YSkKKyAgICBkZWYgY3JlYXRlX3VuaXRfdGVzdChzZWxmLCB1bml0X3Rlc3RzKToKKyAgICAgICAgaWYgdW5pdF90ZXN0cy5oYXNfdGVzdF9kYXRhOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UodW5pdF90ZXN0cy5sZW5ndGgpOgorICAgICAgICAgICAgICAgIHVuaXRfdGVzdCA9IHVuaXRfdGVzdHMuZ2V0X3Rlc3RfdW5pdChpKQorICAgICAgICAgICAgICAgIGlmIHVuaXRfdGVzdC5oYXNfdGVzdF9kYXRhOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbmRlcl9jbGFzcyhjbGF6ej11bml0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU9J3VuaXRfdGVzdC5qYXZhJywgc3JjX2Rpcj0ic3JjL3Rlc3QvamF2YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj11bml0X3Rlc3QuamF2YV9jbGFzcy52ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Q9dW5pdF90ZXN0LCBtc2c9dW5pdF90ZXN0LmphdmFfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9kYXRhPXVuaXRfdGVzdC50ZXN0X2RhdGEpCiAKICAgICBkZWYgY3JlYXRlX29mX2ZhY3RvcmllcyhzZWxmKToKICAgICAgICAgZmFjdG9yeSA9IHNlbGYuamF2YV9tb2RlbC5vZl9mYWN0b3J5CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9pbXBvcnRfY2xlYW5lci5weSBiL2phdmFfZ2VuL2ltcG9ydF9jbGVhbmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzODk3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhX2dlbi9pbXBvcnRfY2xlYW5lci5weQpAQCAtMCwwICsxLDc3IEBACisjIS91c3IvYmluL3B5dGhvbgorCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKKworY2xhc3MgSW1wb3J0TGluZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGluZSk6CisgICAgICAgIHNlbGYubGluZSA9IGxpbmUKKyAgICAgICAgY2xhc3NfbmFtZSA9IE5vbmUKKyAgICAgICAgaWYgbGluZVtsZW4obGluZSkgLSAxXSA9PSAnKic6CisgICAgICAgICAgICBjbGFzc19uYW1lID0gJyonCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpID0gNworICAgICAgICAgICAgd2hpbGUgaSA8IGxlbihsaW5lKSAtIDE6CisgICAgICAgICAgICAgICAgaWYgcmUubWF0Y2goJ1wuW0EtWl1bXC4uXSokJywgbGluZVtpIC0gMSA6IGxlbihsaW5lKSAtIDFdKToKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NfbmFtZSA9IGxpbmVbaSA6IGxlbihsaW5lKSAtIDFdCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgICAgICBpZiBjbGFzc19uYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY2xhc3NfbmFtZSA9IGxpbmVbbGluZS5yZmluZCgnLicpICsgMSA6IGxlbihsaW5lKSAtIDFdCisgICAgICAgIHNlbGYuY2xhc3NfbmFtZSA9IGNsYXNzX25hbWUKKworCitjbGFzcyBJbXBvcnRDbGVhbmVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKKyAgICAgICAgZiA9IG9wZW4ocGF0aCkKKyAgICAgICAgc2VsZi5pbXBfbGluZXMgPSBbXQorICAgICAgICBzZWxmLmNvZGVfbGluZXMgPSBbXQorICAgICAgICBzZWxmLmltcG9ydHNfZmlyc3RfbGluZSA9IC0xCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICBpZiBsZW4obGluZSkgPiA2IGFuZCByZS5tYXRjaCgnXlsgXHRdKmltcG9ydCAnLCBsaW5lKToKKyAgICAgICAgICAgICAgICBzZWxmLmltcF9saW5lcy5hcHBlbmQoSW1wb3J0TGluZShsaW5lLnJzdHJpcCgpKSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmltcG9ydHNfZmlyc3RfbGluZSA9PSAtMToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbXBvcnRzX2ZpcnN0X2xpbmUgPSBpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuY29kZV9saW5lcy5hcHBlbmQobGluZS5yc3RyaXAoKSkKKyAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBmaW5kX3VzZWRfaW1wb3J0cyhzZWxmKToKKyAgICAgICAgc2VsZi51c2VkX2ltcG9ydHMgPSBbXQorICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmNvZGVfbGluZXM6CisgICAgICAgICAgICB0ZW1wID0gW10KKyAgICAgICAgICAgIGZvciBpbXAgaW4gc2VsZi5pbXBfbGluZXM6CisgICAgICAgICAgICAgICAgaWYgaW1wLmNsYXNzX25hbWUgPT0gJyonIG9yIGxpbmUuZmluZChpbXAuY2xhc3NfbmFtZSkgPiAtMToKKyAgICAgICAgICAgICAgICAgICAgdGVtcC5hcHBlbmQoaW1wKQorICAgICAgICAgICAgZm9yIHggaW4gdGVtcDoKKyAgICAgICAgICAgICAgICBzZWxmLmltcF9saW5lcy5yZW1vdmUoeCkKKyAgICAgICAgICAgICAgICBzZWxmLnVzZWRfaW1wb3J0cy5hcHBlbmQoeCkKKworICAgIGRlZiByZXdyaXRlX2ZpbGUoc2VsZiwgcGF0aCk6CisgICAgICAgIGYgPSBvcGVuKHBhdGgsICd3JykKKyAgICAgICAgaW1wb3J0c193cml0dGVuID0gRmFsc2UKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuY29kZV9saW5lcykpOgorICAgICAgICAgICAgaWYgbm90IGltcG9ydHNfd3JpdHRlbiBhbmQgc2VsZi5pbXBvcnRzX2ZpcnN0X2xpbmUgPT0gaToKKyAgICAgICAgICAgICAgICAjIFB1dCBhbGwgaW1wb3J0cworICAgICAgICAgICAgICAgIGZvciBpbXAgaW4gc2VsZi51c2VkX2ltcG9ydHM6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoaW1wLmxpbmUgKyAnXG4nKQorICAgICAgICAgICAgICAgIGltcG9ydHNfd3JpdHRlbiA9IFRydWUKKyAgICAgICAgICAgICMgUHV0IG5leHQgY29kZSBsaW5lCisgICAgICAgICAgICBmLndyaXRlKHNlbGYuY29kZV9saW5lc1tpXSArICdcbicpCisgICAgICAgIGYuY2xvc2UoKQorCitkZWYgbWFpbihhcmd2KToKKyAgICBpZiBsZW4oYXJndikgIT0gMjoKKyAgICAgICAgcHJpbnQgJ1VzYWdlOiBJbXBvcnRDbGVhbmVyIDxqYXZhIGZpbGU+JworICAgICAgICByZXR1cm4KKworICAgIGZpbGVuYW1lID0gYXJndlsxXQorICAgIHByaW50ICdDbGVhbmluZyBpbXBvcnRzIGZyb20gZmlsZSAlcycgJSAoZmlsZW5hbWUpCisgICAgY2xlYW5lciA9IEltcG9ydENsZWFuZXIoZmlsZW5hbWUpCisgICAgY2xlYW5lci5maW5kX3VzZWRfaW1wb3J0cygpCisgICAgY2xlYW5lci5yZXdyaXRlX2ZpbGUoZmlsZW5hbWUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL2phdmFfbW9kZWwucHkgYi9qYXZhX2dlbi9qYXZhX21vZGVsLnB5CmluZGV4IDBlYjhmMTEuLjY2ZWVhY2QgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL2phdmFfbW9kZWwucHkKKysrIGIvamF2YV9nZW4vamF2YV9tb2RlbC5weQpAQCAtMjE1LDcgKzIxNSw3IEBACiAgICAgICAgICAgICBzZWxmLnBhcmVudF9pbnRlcmZhY2UgPSBwYXJlbnRfaW50ZXJmYWNlCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLnBhcmVudF9pbnRlcmZhY2UgPSBOb25lCi0KKyAgICAgICAgICAgIAogICAgIGRlZiBjbGFzc19pbmZvKHNlbGYpOgogICAgICAgICAiIiIgcmV0dXJuIHR1cGxlIG9mIChwYWNrYWdlX3ByZWZpeCwgcGFyZW50X2NsYXNzKSBmb3IgdGhlIGN1cnJlbnQgSmF2YU9GSW50ZXJmYWNlIiIiCiAgICAgICAgICMgRklYTUU6IFRoaXMgZHVwbGljYXRlcyBpbmhlcml0YW5jZSBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdyBhdmFpbGFibGUgaW4gdGhlIGxveGlfaXIKQEAgLTMzMCw3ICszMzAsNyBAQAogICAgIEBwcm9wZXJ0eQogICAgIEBtZW1vaXplCiAgICAgZGVmIHVuaXRfdGVzdChzZWxmKToKLSAgICAgICAgcmV0dXJuIEphdmFVbml0VGVzdChzZWxmKQorICAgICAgICByZXR1cm4gSmF2YVVuaXRUZXN0U2V0KHNlbGYpCiAKICAgICBAcHJvcGVydHkKICAgICBkZWYgbmFtZShzZWxmKToKQEAgLTU5NSwxOCArNTk1LDU4IEBACiAjIyMgVW5pdCBUZXN0CiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1jbGFzcyBKYXZhVW5pdFRlc3Qob2JqZWN0KToKK2NsYXNzIEphdmFVbml0VGVzdFNldChvYmplY3QpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBqYXZhX2NsYXNzKToKICAgICAgICAgc2VsZi5qYXZhX2NsYXNzID0gamF2YV9jbGFzcwotICAgICAgICBzZWxmLmRhdGFfZmlsZV9uYW1lID0gIm9me3ZlcnNpb259L3tuYW1lfS5kYXRhIi5mb3JtYXQodmVyc2lvbj1qYXZhX2NsYXNzLnZlcnNpb24ub2ZfdmVyc2lvbiwKKyAgICAgICAgZmlyc3RfZGF0YV9maWxlX25hbWUgPSAib2Z7dmVyc2lvbn0ve25hbWV9LmRhdGEiLmZvcm1hdCh2ZXJzaW9uPWphdmFfY2xhc3MudmVyc2lvbi5vZl92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPWphdmFfY2xhc3MuY19uYW1lWzM6XSkKKyAgICAgICAgZGF0YV9maWxlX3RlbXBsYXRlID0gIm9me3ZlcnNpb259L3tuYW1lfS4iLmZvcm1hdCh2ZXJzaW9uPWphdmFfY2xhc3MudmVyc2lvbi5vZl92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPWphdmFfY2xhc3MuY19uYW1lWzM6XSkgKyAie2l9LmRhdGEiCisgICAgICAgIHRlc3RfY2xhc3NfbmFtZSA9IHNlbGYuamF2YV9jbGFzcy5uYW1lICsgIlRlc3QiCisgICAgICAgIHNlbGYudGVzdF91bml0cyA9IFtdCisgICAgICAgIGlmIHRlc3RfZGF0YS5leGlzdHMoZmlyc3RfZGF0YV9maWxlX25hbWUpOgorICAgICAgICAgICAgc2VsZi50ZXN0X3VuaXRzLmFwcGVuZChKYXZhVW5pdFRlc3QoamF2YV9jbGFzcywgZmlyc3RfZGF0YV9maWxlX25hbWUsIHRlc3RfY2xhc3NfbmFtZSkpCisgICAgICAgIGkgPSAxCisgICAgICAgIHdoaWxlIHRlc3RfZGF0YS5leGlzdHMoZGF0YV9maWxlX3RlbXBsYXRlLmZvcm1hdChpPWkpKToKKyAgICAgICAgICAgIHNlbGYudGVzdF91bml0cy5hcHBlbmQoSmF2YVVuaXRUZXN0KGphdmFfY2xhc3MsIGRhdGFfZmlsZV90ZW1wbGF0ZS5mb3JtYXQoaT1pKSwgdGVzdF9jbGFzc19uYW1lICsgc3RyKGkpKSkKKyAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcGFja2FnZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuamF2YV9jbGFzcy5wYWNrYWdlCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgaGFzX3Rlc3RfZGF0YShzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLnRlc3RfdW5pdHMpID4gMAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGxlbmd0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLnRlc3RfdW5pdHMpCisgICAgCisgICAgZGVmIGdldF90ZXN0X3VuaXQoc2VsZiwgaSk6CisgICAgICAgIHJldHVybiBzZWxmLnRlc3RfdW5pdHNbaV0KKworCitjbGFzcyBKYXZhVW5pdFRlc3Qob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgamF2YV9jbGFzcywgZmlsZV9uYW1lPU5vbmUsIHRlc3RfY2xhc3NfbmFtZT1Ob25lKToKKyAgICAgICAgc2VsZi5qYXZhX2NsYXNzID0gamF2YV9jbGFzcworICAgICAgICBpZiBmaWxlX25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGF0YV9maWxlX25hbWUgPSAib2Z7dmVyc2lvbn0ve25hbWV9LmRhdGEiLmZvcm1hdCh2ZXJzaW9uPWphdmFfY2xhc3MudmVyc2lvbi5vZl92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1qYXZhX2NsYXNzLmNfbmFtZVszOl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRhdGFfZmlsZV9uYW1lID0gZmlsZV9uYW1lCisgICAgICAgIGlmIHRlc3RfY2xhc3NfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50ZXN0X2NsYXNzX25hbWUgPSBzZWxmLmphdmFfY2xhc3MubmFtZSArICJUZXN0IgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ZXN0X2NsYXNzX25hbWUgPSB0ZXN0X2NsYXNzX25hbWUKKyAgICAgICAgCiAgICAgQHByb3BlcnR5CiAgICAgZGVmIHBhY2thZ2Uoc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLmphdmFfY2xhc3MucGFja2FnZQogCiAgICAgQHByb3BlcnR5CiAgICAgZGVmIG5hbWUoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmphdmFfY2xhc3MubmFtZSArICJUZXN0IgorICAgICAgICByZXR1cm4gc2VsZi50ZXN0X2NsYXNzX25hbWUKIAogICAgIEBwcm9wZXJ0eQogICAgIGRlZiBoYXNfdGVzdF9kYXRhKHNlbGYpOgpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vamF2YV90eXBlLnB5IGIvamF2YV9nZW4vamF2YV90eXBlLnB5CmluZGV4IGNjMzRhNTcuLjM1NTAzZTUgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL2phdmFfdHlwZS5weQorKysgYi9qYXZhX2dlbi9qYXZhX3R5cGUucHkKQEAgLTEsNiArMSw2IEBACitpbXBvcnQgZXJybm8KIGltcG9ydCBsb3hpX3V0aWxzLmxveGlfdXRpbHMgYXMgbG94aV91dGlscwogaW1wb3J0IG9zCi1pbXBvcnQgZXJybm8KIGltcG9ydCByZQogaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCB0aW1lCkBAIC0yMDcsNiArMjA3LDEwIEBACiAgICAgICAgIC5vcChyZWFkPSdiYi5yZWFkSW50KCknLCB3cml0ZT0nYmIud3JpdGVJbnQoJG5hbWUpJywgcHViX3R5cGU9RmFsc2UpCiB1MzJfbGlzdCA9IEpUeXBlKCdMaXN0PFUzMj4nLCAnaW50W10nKSBcCiAgICAgICAgIC5vcChyZWFkPSdDaGFubmVsVXRpbHMucmVhZExpc3QoYmIsICRsZW5ndGgsIFUzMi5SRUFERVIpJywgd3JpdGU9J0NoYW5uZWxVdGlscy53cml0ZUxpc3QoYmIsICRuYW1lKScpCit1OG9iaiA9IEpUeXBlKCdVOCcsICdVOCcpIFwKKyAgICAgICAgLm9wKHJlYWQ9J1U4Lm9mKGJiLnJlYWRCeXRlKCkpJywgd3JpdGU9J2JiLndyaXRlQnl0ZSgkbmFtZS5nZXRSYXcoKSknKQordTMyb2JqID0gSlR5cGUoJ1UzMicsICdVMzInKSBcCisgICAgICAgIC5vcChyZWFkPSdVMzIub2YoYmIucmVhZEludCgpKScsIHdyaXRlPSdiYi53cml0ZUludCgkbmFtZS5nZXRSYXcoKSknKQogdTY0ID0gSlR5cGUoJ1U2NCcsICdVNjQnKSBcCiAgICAgICAgIC5vcChyZWFkPSdVNjQub2YoYmIucmVhZExvbmcoKSknLCB3cml0ZT0nYmIud3JpdGVMb25nKCRuYW1lLmdldFZhbHVlKCkpJykKIG9mX3BvcnQgPSBKVHlwZSgiT0ZQb3J0IikgXApAQCAtMjYyLDYgKzI2NiwyOCBAQAogICAgICAgICAub3AocmVhZD0iV2lsZGNhcmRzLm9mKGJiLnJlYWRJbnQoKSkiLCB3cml0ZT0iYmIud3JpdGVJbnQoJG5hbWUuZ2V0SW50KCkpIik7CiB0cmFuc3BvcnRfcG9ydCA9IEpUeXBlKCJUcmFuc3BvcnRQb3J0IilcCiAgICAgICAgIC5vcChyZWFkPSJUcmFuc3BvcnRQb3J0LnJlYWQyQnl0ZXMoYmIpIiwgd3JpdGU9IiRuYW1lLndyaXRlMkJ5dGVzKGJiKSIpCitldGhfdHlwZSA9IEpUeXBlKCJFdGhUeXBlIilcCisgICAgICAgIC5vcChyZWFkPSJFdGhUeXBlLnJlYWQyQnl0ZXMoYmIpIiwgd3JpdGU9IiRuYW1lLndyaXRlMkJ5dGVzKGJiKSIpCit2bGFuX3ZpZCA9IEpUeXBlKCJWbGFuVmlkIilcCisgICAgICAgIC5vcChyZWFkPSJWbGFuVmlkLnJlYWQyQnl0ZXMoYmIpIiwgd3JpdGU9IiRuYW1lLndyaXRlMkJ5dGVzKGJiKSIpCit2bGFuX3BjcCA9IEpUeXBlKCJWbGFuUGNwIilcCisgICAgICAgIC5vcChyZWFkPSJWbGFuUGNwLnJlYWRCeXRlKGJiKSIsIHdyaXRlPSIkbmFtZS53cml0ZUJ5dGUoYmIpIikKK2lwX2RzY3AgPSBKVHlwZSgiSXBEc2NwIilcCisgICAgICAgIC5vcChyZWFkPSJJcERzY3AucmVhZEJ5dGUoYmIpIiwgd3JpdGU9IiRuYW1lLndyaXRlQnl0ZShiYikiKQoraXBfZWNuID0gSlR5cGUoIklwRWNuIilcCisgICAgICAgIC5vcChyZWFkPSJJcEVjbi5yZWFkQnl0ZShiYikiLCB3cml0ZT0iJG5hbWUud3JpdGVCeXRlKGJiKSIpCitpcF9wcm90byA9IEpUeXBlKCJJcFByb3RvY29sIilcCisgICAgICAgIC5vcChyZWFkPSJJcFByb3RvY29sLnJlYWRCeXRlKGJiKSIsIHdyaXRlPSIkbmFtZS53cml0ZUJ5dGUoYmIpIikKK2ljbXB2NF90eXBlID0gSlR5cGUoIklDTVB2NFR5cGUiKVwKKyAgICAgICAgLm9wKHJlYWQ9IklDTVB2NFR5cGUucmVhZEJ5dGUoYmIpIiwgd3JpdGU9IiRuYW1lLndyaXRlQnl0ZShiYikiKQoraWNtcHY0X2NvZGUgPSBKVHlwZSgiSUNNUHY0Q29kZSIpXAorICAgICAgICAub3AocmVhZD0iSUNNUHY0Q29kZS5yZWFkQnl0ZShiYikiLCB3cml0ZT0iJG5hbWUud3JpdGVCeXRlKGJiKSIpCithcnBfb3AgPSBKVHlwZSgiQXJwT3Bjb2RlIilcCisgICAgICAgIC5vcChyZWFkPSJBcnBPcGNvZGUucmVhZDJCeXRlcyhiYikiLCB3cml0ZT0iJG5hbWUud3JpdGUyQnl0ZXMoYmIpIikKK2lwdjZfZmxhYmVsID0gSlR5cGUoIklQdjZGbG93TGFiZWwiKVwKKyAgICAgICAgLm9wKHJlYWQ9IklQdjZGbG93TGFiZWwucmVhZDRCeXRlcyhiYikiLCB3cml0ZT0iJG5hbWUud3JpdGU0Qnl0ZXMoYmIpIikKK21ldGFkYXRhID0gSlR5cGUoIk9GTWV0YWRhdGEiKVwKKyAgICAgICAgLm9wKHJlYWQ9Ik9GTWV0YWRhdGEucmVhZDhCeXRlcyhiYikiLCB3cml0ZT0iJG5hbWUud3JpdGU4Qnl0ZXMoYmIpIikKIG94bSA9IEpUeXBlKCJPRk94bSIpXAogICAgICAgICAub3AocmVhZD0iT0ZPeG1WZXIkdmVyc2lvbi5SRUFERVIucmVhZEZyb20oYmIpIiwgd3JpdGU9IiRuYW1lLndyaXRlVG8oYmIpIikKIG1ldGVyX2ZlYXR1cmVzID0gSlR5cGUoIk9GTWV0ZXJGZWF0dXJlcyIpXApAQCAtMzAwLDEzICszMjYsNTQgQEAKICMjIE1hcCB0aGF0IGRlZmluZXMgZXhjZXB0aW9ucyBmcm9tIHRoZSBzdGFuZGFyZCBsb3hpLT5qYXZhIG1hcHBpbmcgc2NoZW1lCiAjIG1hcCBvZiB7PGxveGlfY2xhc3NfbmFtZT4gOiB7IDxsb3hpX21lbWJlcl9uYW1lPiA6IDxKVHlwZSBpbnN0YW5jZT4gfSB9CiBleGNlcHRpb25zID0gewotICAgICAgICAnb2ZfcGFja2V0X2luJzogewotICAgICAgICAgICAgJ2RhdGEnIDogb2N0ZXRzLAotICAgICAgICAgICAgJ3JlYXNvbic6IHBhY2tldGluX3JlYXNvbgotICAgICAgICAgICAgfSwKLSAgICAgICAgJ29mX294bV90Y3Bfc3JjJyA6IHsKLSAgICAgICAgICAgICd2YWx1ZScgOiB0cmFuc3BvcnRfcG9ydAotICAgICAgICAgICAgfSwKKyAgICAgICAgJ29mX3BhY2tldF9pbic6IHsgJ2RhdGEnIDogb2N0ZXRzLCAncmVhc29uJzogcGFja2V0aW5fcmVhc29uIH0sCisgICAgICAgICdvZl9veG1fdGNwX3NyYycgOiB7ICd2YWx1ZScgOiB0cmFuc3BvcnRfcG9ydCB9LAorICAgICAgICAnb2Zfb3htX3RjcF9zcmNfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IHRyYW5zcG9ydF9wb3J0LCAndmFsdWVfbWFzaycgOiB0cmFuc3BvcnRfcG9ydCB9LAorICAgICAgICAnb2Zfb3htX3RjcF9kc3QnIDogeyAndmFsdWUnIDogdHJhbnNwb3J0X3BvcnQgfSwKKyAgICAgICAgJ29mX294bV90Y3BfZHN0X21hc2tlZCcgOiB7ICd2YWx1ZScgOiB0cmFuc3BvcnRfcG9ydCwgJ3ZhbHVlX21hc2snIDogdHJhbnNwb3J0X3BvcnQgfSwKKyAgICAgICAgJ29mX294bV91ZHBfc3JjJyA6IHsgJ3ZhbHVlJyA6IHRyYW5zcG9ydF9wb3J0IH0sCisgICAgICAgICdvZl9veG1fdWRwX3NyY19tYXNrZWQnIDogeyAndmFsdWUnIDogdHJhbnNwb3J0X3BvcnQsICd2YWx1ZV9tYXNrJyA6IHRyYW5zcG9ydF9wb3J0IH0sCisgICAgICAgICdvZl9veG1fdWRwX2RzdCcgOiB7ICd2YWx1ZScgOiB0cmFuc3BvcnRfcG9ydCB9LAorICAgICAgICAnb2Zfb3htX3VkcF9kc3RfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IHRyYW5zcG9ydF9wb3J0LCAndmFsdWVfbWFzaycgOiB0cmFuc3BvcnRfcG9ydCB9LAorICAgICAgICAnb2Zfb3htX3NjdHBfc3JjJyA6IHsgJ3ZhbHVlJyA6IHRyYW5zcG9ydF9wb3J0IH0sCisgICAgICAgICdvZl9veG1fc2N0cF9zcmNfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IHRyYW5zcG9ydF9wb3J0LCAndmFsdWVfbWFzaycgOiB0cmFuc3BvcnRfcG9ydCB9LAorICAgICAgICAnb2Zfb3htX3NjdHBfZHN0JyA6IHsgJ3ZhbHVlJyA6IHRyYW5zcG9ydF9wb3J0IH0sCisgICAgICAgICdvZl9veG1fc2N0cF9kc3RfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IHRyYW5zcG9ydF9wb3J0LCAndmFsdWVfbWFzaycgOiB0cmFuc3BvcnRfcG9ydCB9LAorICAgICAgICAnb2Zfb3htX2V0aF90eXBlJyA6IHsgJ3ZhbHVlJyA6IGV0aF90eXBlIH0sCisgICAgICAgICdvZl9veG1fZXRoX3R5cGVfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IGV0aF90eXBlLCAndmFsdWVfbWFzaycgOiBldGhfdHlwZSB9LAorICAgICAgICAnb2Zfb3htX3ZsYW5fdmlkJyA6IHsgJ3ZhbHVlJyA6IHZsYW5fdmlkIH0sCisgICAgICAgICdvZl9veG1fdmxhbl92aWRfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IHZsYW5fdmlkLCAndmFsdWVfbWFzaycgOiB2bGFuX3ZpZCB9LAorICAgICAgICAnb2Zfb3htX3ZsYW5fcGNwJyA6IHsgJ3ZhbHVlJyA6IHZsYW5fcGNwIH0sCisgICAgICAgICdvZl9veG1fdmxhbl9wY3BfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IHZsYW5fcGNwLCAndmFsdWVfbWFzaycgOiB2bGFuX3BjcCB9LAorICAgICAgICAnb2Zfb3htX2lwX2RzY3AnIDogeyAndmFsdWUnIDogaXBfZHNjcCB9LAorICAgICAgICAnb2Zfb3htX2lwX2RzY3BfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IGlwX2RzY3AsICd2YWx1ZV9tYXNrJyA6IGlwX2RzY3AgfSwKKyAgICAgICAgJ29mX294bV9pcF9lY24nIDogeyAndmFsdWUnIDogaXBfZWNuIH0sCisgICAgICAgICdvZl9veG1faXBfZWNuX21hc2tlZCcgOiB7ICd2YWx1ZScgOiBpcF9lY24sICd2YWx1ZV9tYXNrJyA6IGlwX2VjbiB9LAorICAgICAgICAnb2Zfb3htX2lwX3Byb3RvJyA6IHsgJ3ZhbHVlJyA6IGlwX3Byb3RvIH0sCisgICAgICAgICdvZl9veG1faXBfcHJvdG9fbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IGlwX3Byb3RvLCAndmFsdWVfbWFzaycgOiBpcF9wcm90byB9LAorICAgICAgICAnb2Zfb3htX2ljbXB2NF90eXBlJyA6IHsgJ3ZhbHVlJyA6IGljbXB2NF90eXBlIH0sCisgICAgICAgICdvZl9veG1faWNtcHY0X3R5cGVfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IGljbXB2NF90eXBlLCAndmFsdWVfbWFzaycgOiBpY21wdjRfdHlwZSB9LAorICAgICAgICAnb2Zfb3htX2ljbXB2NF9jb2RlJyA6IHsgJ3ZhbHVlJyA6IGljbXB2NF9jb2RlIH0sCisgICAgICAgICdvZl9veG1faWNtcHY0X2NvZGVfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IGljbXB2NF9jb2RlLCAndmFsdWVfbWFzaycgOiBpY21wdjRfY29kZSB9LAorICAgICAgICAnb2Zfb3htX2FycF9vcCcgOiB7ICd2YWx1ZScgOiBhcnBfb3AgfSwKKyAgICAgICAgJ29mX294bV9hcnBfb3BfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IGFycF9vcCwgJ3ZhbHVlX21hc2snIDogYXJwX29wIH0sCisgICAgICAgICdvZl9veG1fYXJwX3NwYScgOiB7ICd2YWx1ZScgOiBpcHY0IH0sCisgICAgICAgICdvZl9veG1fYXJwX3NwYV9tYXNrZWQnIDogeyAndmFsdWUnIDogaXB2NCwgJ3ZhbHVlX21hc2snIDogaXB2NCB9LAorICAgICAgICAnb2Zfb3htX2FycF90cGEnIDogeyAndmFsdWUnIDogaXB2NCB9LAorICAgICAgICAnb2Zfb3htX2FycF90cGFfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IGlwdjQsICd2YWx1ZV9tYXNrJyA6IGlwdjQgfSwKKyAgICAgICAgJ29mX294bV9pcHY2X2ZsYWJlbCcgOiB7ICd2YWx1ZScgOiBpcHY2X2ZsYWJlbCB9LAorICAgICAgICAnb2Zfb3htX2lwdjZfZmxhYmVsX21hc2tlZCcgOiB7ICd2YWx1ZScgOiBpcHY2X2ZsYWJlbCwgJ3ZhbHVlX21hc2snIDogaXB2Nl9mbGFiZWwgfSwKKyAgICAgICAgJ29mX294bV9tZXRhZGF0YScgOiB7ICd2YWx1ZScgOiBtZXRhZGF0YSB9LAorICAgICAgICAnb2Zfb3htX21ldGFkYXRhX21hc2tlZCcgOiB7ICd2YWx1ZScgOiBtZXRhZGF0YSwgJ3ZhbHVlX21hc2snIDogbWV0YWRhdGEgfSwKKworICAgICAgICAnb2Zfb3htX2ljbXB2Nl9jb2RlJyA6IHsgJ3ZhbHVlJyA6IHU4b2JqIH0sCisgICAgICAgICdvZl9veG1faWNtcHY2X2NvZGVfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IHU4b2JqLCAndmFsdWVfbWFzaycgOiB1OG9iaiB9LAorICAgICAgICAnb2Zfb3htX2ljbXB2Nl90eXBlJyA6IHsgJ3ZhbHVlJyA6IHU4b2JqIH0sCisgICAgICAgICdvZl9veG1faWNtcHY2X3R5cGVfbWFza2VkJyA6IHsgJ3ZhbHVlJyA6IHU4b2JqLCAndmFsdWVfbWFzaycgOiB1OG9iaiB9LAorICAgICAgICAnb2Zfb3htX21wbHNfbGFiZWwnIDogeyAndmFsdWUnIDogdTMyb2JqIH0sCisgICAgICAgICdvZl9veG1fbXBsc19sYWJlbF9tYXNrZWQnIDogeyAndmFsdWUnIDogdTMyb2JqLCAndmFsdWVfbWFzaycgOiB1MzJvYmogfSwKKyAgICAgICAgJ29mX294bV9tcGxzX3RjJyA6IHsgJ3ZhbHVlJyA6IHU4b2JqIH0sCisgICAgICAgICdvZl9veG1fbXBsc190Y19tYXNrZWQnIDogeyAndmFsdWUnIDogdThvYmosICd2YWx1ZV9tYXNrJyA6IHU4b2JqIH0sCiB9CiAKIApkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2guamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoLmphdmEKaW5kZXggZDM1ZjcwOS4uOGYxNzg0NSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2guamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9NYXRjaC5qYXZhCkBAIC00LDg5ICs0LDE5MCBAQAogaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5NYXNrZWQ7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk9GVmFsdWVUeXBlOwogCi1wdWJsaWMgaW50ZXJmYWNlIE1hdGNoIGV4dGVuZHMgT0ZPYmplY3QgewotCi0gICAgLyoKLSAgICAgKiBQcmVjb25kaXRpb25zCi0gICAgICogT24gcHJlY29uZGl0aW9ucyAoZnJvbSB0aGUgT0YxLjEgc3BlYywgcGFnZSAyOCwgdGhlIE9GMS4wIHNwZWMgZmFpbGVkIHRvIGV4cGxpY2l0bHkKLSAgICAgKiBzcGVjaWZ5IHRoaXMsIGJ1dCBpdCBpcyB0aGUgYmVoYXZpb3Igb2YgT2YxLjAgc3dpdGNoZXMpOgotICAgICAqIFByb3RvY29sLXNwZWNpZmljIGZpZWxkcyB3aXRoaW4gb2ZwX21hdGNoIHdpbGwgYmUgaWdub3JlZCB3aXRoaW4gYSBzaW5nbGUgdGFibGUgd2hlbgotICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHByb3RvY29sIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIG1hdGNoLiBUaGUgTVBMUyBtYXRjaCBmaWVsZHMgd2lsbAotICAgICAqIGJlIGlnbm9yZWQgdW5sZXNzIHRoZSBFdGhlcnR5cGUgaXMgc3BlY2lmaWVkIGFzIE1QTFMuIExpa2V3aXNlLCB0aGUgSVAgaGVhZGVyIGFuZAotICAgICAqIHRyYW5zcG9ydCBoZWFkZXIgZmllbGRzIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgdGhlIEV0aGVydHlwZSBpcyBzcGVjaWZpZWQgYXMgZWl0aGVyCi0gICAgICogSVB2NCBvciBBUlAuIFRoZSB0cF9zcmMgYW5kIHRwX2RzdCBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB0aGUgbmV0d29yayBwcm90b2NvbAotICAgICAqIHNwZWNpZmllZCBpcyBhcyBUQ1AsIFVEUCBvciBTQ1RQLiBGaWVsZHMgdGhhdCBhcmUgaWdub3JlZCBkb27vv710IG5lZWQgdG8gYmUgd2lsZGNhcmRlZAotICAgICAqIGFuZCBzaG91bGQgYmUgc2V0IHRvIDAuCi0gICAgICovCisvKioKKyAqIEdlbmVyaWMgaW50ZXJmYWNlIGZvciB2ZXJzaW9uLWFnbm9zdGljIGltbXV0YWJsZSBNYXRjaCBzdHJ1Y3R1cmUuCisgKiBUaGUgTWF0Y2ggc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gdGhlIE9wZW5GbG93IHByb3RvY29sLCBhbmQgaXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24KKyAqIHRoZSBmaWVsZHMgdG8gYmUgbWF0Y2hlZCBpbiBhIHNwZWNpZmljIGZsb3cgcmVjb3JkLgorICogVGhpcyBpbnRlcmZhY2UgZG9lcyBub3QgYXNzdW1lIGFueXRoaW5nIG9uIHRoZSBmaWVsZHMgaW4gdGhlIE1hdGNoIHN0cnVjdHVyZS4gSWYgaW4KKyAqIHNvbWUgdmVyc2lvbiwgdGhlIG1hdGNoIHN0cnVjdHVyZSBjYW5ub3QgaGFuZGxlIGEgY2VydGFpbiBmaWVsZCwgaXQgbWF5IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KKyAqIGZvciA8Y29kZT5zdXBwb3J0cyguLi4pPC9jb2RlPiBjYWxscywgYW5kIHRocm93IDxjb2RlPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBmcm9tIGFsbAorICogb3RoZXIgbWV0aG9kcyBpbiBzdWNoIGNhc2VzLgorICogPGJyPjxicj4KKyAqIE9uIHdpbGRjYXJkcyBhbmQgbWFza3M6PGJyPgorICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1hc2tpbmcgbm90YXRpb25zIGZvciBmaWVsZHM6CisgKiA8dWw+CisgKiA8bGk+PGI+RXhhY3Q8L2I+OiBmaWVsZCBpcyBtYXRjaGVkIGV4YWN0bHkgYWdhaW5zdCBhIHNpbmdsZSwgZml4ZWQgdmFsdWUgKG5vIG1hc2ssIG9yIG1hc2sgaXMgYWxsIG9uZXMpLgorICogPGxpPjxiPldpbGRjYXJkZWQ8L2I+OiBmaWVsZCBpcyBub3QgYmVpbmcgbWF0Y2hlZC4gSXQgaXMgZnVsbHkgbWFza2VkIChtYXNrPTApIGFuZCBhbnkgdmFsdWUgb2YgaXQKKyAqIHdpbGwgbWF0Y2ggdGhlIGZsb3cgcmVjb3JkIGhhdmluZyB0aGlzIG1hdGNoLgorICogPGxpPjxiPlBhcnRpYWxseSBtYXNrZWQ8L2I+OiBmaWVsZCBpcyBtYXRjaGVkIHVzaW5nIGEgc3BlY2lmaWVkIG1hc2sgd2hpY2ggaXMgbmVpdGhlciAwIG5vciBhbGwgb25lcy4gTWFzayBjYW4KKyAqIGJlIGVpdGhlciBhcmJpdHJhcnkgb3IgcmVxdWlyZSBzb21lIHNwZWNpZmljIHN0cnVjdHVyZS4KKyAqIDwvdWw+CisgKiBJbXBsZW1lbnRpbmcgY2xhc3NlcyBtYXkgb3IgbWF5IG5vdCBzdXBwb3J0IGFsbCB0eXBlcyBvZiB0aGVzZSBtYXNraW5nIHR5cGVzLiBUaGV5IG1heSBhbHNvIHN1cHBvcnQKKyAqIHRoZW0gaW4gcGFydC4gRm9yIGV4YW1wbGUsIE9GMS4wIHN1cHBvcnRzIGV4YWN0IG1hdGNoIGFuZCAoZnVsbCkgd2lsZGNhcmRpbmcgZm9yIGFsbCBmaWVsZHMsIGJ1dCBpdAorICogZG9lcyBvbmx5IHN1cHBvcnRzIHBhcnRpYWwgbWFza2luZyBmb3IgSVAgc291cmNlL2Rlc3RpbmF0aW9uIGZpZWxkcywgYW5kIHRoaXMgcGFydGlhbCBtYXNraW5nIG11c3QgYmUKKyAqIGluIHRoZSBDSURSIHByZWZpeCBmb3JtYXQuIFRodXMsIE9GMS4wIGltcGxlbWVudGF0aW9uIG1heSB0aHJvdyA8Y29kZT5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4gaWYgZ2l2ZW4KKyAqIGluIDxjb2RlPnNldE1ha3NlZDwvY29kZT4gYW4gSVAgbWFzayBvZiwgZm9yIGV4YW1wbGUsIDI1NS4wLjI1NS4wLCBvciBpZiA8Y29kZT5zZXRNYXNrZWQ8L2NvZGU+IGlzIGNhbGxlZCBmb3IgYW55IGZpZWxkCisgKiB3aGljaCBpcyBub3QgSVAgc291cmNlL2Rlc3RpbmF0aW9uIGFkZHJlc3MuCisgKiA8YnI+PGJyPgorICogT24gcHJlcmVxdWlzaXRlczo8YnI+CisgKiBGcm9tIHRoZSBPRjEuMSBzcGVjLCBwYWdlIDI4LCB0aGUgT0YxLjAgc3BlYyBmYWlsZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoaXMsIGJ1dCBpdAorICogaXMgdGhlIGJlaGF2aW9yIG9mIE9GMS4wIHN3aXRjaGVzOgorICogIlByb3RvY29sLXNwZWNpZmljIGZpZWxkcyB3aXRoaW4gb2ZwX21hdGNoIHdpbGwgYmUgaWdub3JlZCB3aXRoaW4gYSBzaW5nbGUgdGFibGUgd2hlbiAKKyAqIHRoZSBjb3JyZXNwb25kaW5nIHByb3RvY29sIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIG1hdGNoLiBUaGUgTVBMUyBtYXRjaCBmaWVsZHMgd2lsbCAKKyAqIGJlIGlnbm9yZWQgdW5sZXNzIHRoZSBFdGhlcnR5cGUgaXMgc3BlY2lmaWVkIGFzIE1QTFMuIExpa2V3aXNlLCB0aGUgSVAgaGVhZGVyIGFuZCAKKyAqIHRyYW5zcG9ydCBoZWFkZXIgZmllbGRzIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgdGhlIEV0aGVydHlwZSBpcyBzcGVjaWZpZWQgYXMgZWl0aGVyIAorICogSVB2NCBvciBBUlAuIFRoZSB0cF9zcmMgYW5kIHRwX2RzdCBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB0aGUgbmV0d29yayBwcm90b2NvbCAKKyAqIHNwZWNpZmllZCBpcyBhcyBUQ1AsIFVEUCBvciBTQ1RQLiBGaWVsZHMgdGhhdCBhcmUgaWdub3JlZCBkb27VdCBuZWVkIHRvIGJlIHdpbGRjYXJkZWQgCisgKiBhbmQgc2hvdWxkIGJlIHNldCB0byAwLiIKKyAqIDxicj48YnI+CisgKiBUaGlzIGludGVyZmFjZSB1c2VzIGdlbmVyaWNzIHRvIGFzc3VyZSB0eXBlIHNhZmV0eSBpbiB1c2VycyBjb2RlLiBIb3dldmVyLCBpbXBsZW1lbnRpbmcgY2xhc3NlcyBtYXkgaGF2ZSB0byBzdXBwcmVzcyAKKyAqICd1bmNoZWNrZWQgY2FzdCcgd2FybmluZ3Mgd2hpbGUgbWFraW5nIHN1cmUgdGhleSBjb3JyZWN0bHkgY2FzdCBiYXNlIG9uIHRoZWlyIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisgKiAKKyAqIEBhdXRob3IgWW90YW0gSGFyY2hvbCAoeW90YW0uaGFyY2hvbEBiaWdzd2l0Y2guY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIE1hdGNoIGV4dGVuZHMgT0ZPYmplY3QgeyAgICAKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQgZnJvbSB0aGlzIG1hdGNoLgotICAgICAqCisgICAgICogUmV0dXJucyBhIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQgaWY6CisgICAgICogPHVsPgorICAgICAqIDxsaT5GaWVsZCBpcyBzdXBwb3J0ZWQKKyAgICAgKiA8bGk+RmllbGQgaXMgbm90IGZ1bGx5IHdpbGRjYXJkZWQKKyAgICAgKiA8bGk+UHJlcmVxdWlzaXRlcyBhcmUgb2sKKyAgICAgKiA8L3VsPgorICAgICAqIElmIG9uZSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBkb2VzIG5vdCBob2xkLCByZXR1cm5zIG51bGwuIFZhbHVlIGlzIHJldHVybmVkIG1hc2tlZCBpZiBwYXJ0aWFsbHkgd2lsZGNhcmRlZC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gcmV0cmlldmUKLSAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIG1hdGNoIGZpZWxkCisgICAgICogQHJldHVybiBWYWx1ZSBvZiBtYXRjaCBmaWVsZCAobWF5IGJlIG1hc2tlZCksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGZpZWxkIGlzIG9uZSBvZiB0aGUgY29uZGl0aW9ucyBhYm92ZSBkb2VzIG5vdCBob2xkLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgZmllbGQgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gRiBnZXQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWFza2VkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQgZnJvbSB0aGlzIG1hdGNoLgotICAgICAqIFByZWNvbmRpdGlvbjogZmllbGQgaXMgcGFydGlhbGx5IHdpbGRjYXJkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gcmV0cmlldmUKLSAgICAgKiBAcmV0dXJuIE1hc2tlZCB2YWx1ZSBvZiBtYXRjaCBmaWVsZCBvciBudWxsIGlmIG5vIG1hc2sKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXNrZWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZCBmcm9tIHRoaXMgbWF0Y2gsIGFsb25nIHdpdGggdGhlIG1hc2sgaXRzZWxmLgorICAgICAqIFByZXJlcXVpc2l0ZTogZmllbGQgaXMgcGFydGlhbGx5IG1hc2tlZC4KKyAgICAgKiBJZiBwcmVyZXF1aXNpdGUgaXMgbm90IG1ldCwgYSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gcmV0cmlldmUuCisgICAgICogQHJldHVybiBNYXNrZWQgdmFsdWUgb2YgbWF0Y2ggZmllbGQgb3IgbnVsbCBpZiBubyBtYXNrIGlzIHNldC4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIElmIGZpZWxkIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICovCiAgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hc2tlZDxGPiBnZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWF0Y2ggb2JqZWN0IHN1cHBvcnRzIHRoZSBnaXZlbiBtYXRjaCBmaWVsZC4KLSAgICAgKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIG1hdGNoIG9iamVjdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gbWF0Y2ggZmllbGQuCisgICAgICogCiAgICAgICogQHBhcmFtIGZpZWxkIE1hdGNoIGZpZWxkCi0gICAgICogQHJldHVybgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBmaWVsZCBpcyBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhNYXRjaEZpZWxkPD8+IGZpZWxkKTsKIAogICAgIC8qKgotICAgICAqIHRydWUgaWZmIGZpZWxkIHN1cHBvcnRzIGEgYml0bWFzayBtYXNrIHRoYXQgd2lsZGNhcmRzIHBhcnQgb2YgdGhlIGZpZWxkCisgICAgICogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgbWF0Y2ggb2JqZWN0IHN1cHBvcnRzIHBhcnRpYWxseSBiaXRtYXNraW5nIG9mIHRoZSBnaXZlbiBmaWVsZC4KICAgICAgKiAobm90ZTogbm90IGFsbCBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhpcyBiaXRtYXNrIGhhdmUgdG8gYmUgYWNjZXB0YWJsZSkKLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZAotICAgICAqIEByZXR1cm4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQuCisgICAgICogQHJldHVybiB0cnVlIGlmIGZpZWxkIGNhbiBiZSBwYXJ0aWFsbHkgbWFza2VkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiBmaWVsZCBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWFza2VkKE1hdGNoRmllbGQ8Pz4gZmllbGQpOworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWFza2VkKE1hdGNoRmllbGQ8Pz4gZmllbGQpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKIAogICAgIC8qKgotICAgICAqIFRydWUgaWZmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IGZ1bGx5IHNwZWNpZmllZCBpbiB0aGUgbWF0Y2gsIGkuZS4sIHRoZQotICAgICAqIG1hdGNoIHdpbGwgb25seSBzZWxlY3QgcGFja2V0cyB0aGF0IG1hdGNoIHRoZSBleGFjdCB2YWx1ZSBvZiBnZXRGaWVsZChmaWVsZCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQKLSAgICAgKiBAcmV0dXJuCisgICAgICogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IHNwZWNpZmllZCBpbiB0aGUgbWF0Y2ggd2l0aCBhbiBleGFjdCB2YWx1ZSBhbmQKKyAgICAgKiBubyBtYXNrLiBJLmUuLCB0aGUgc3BlY2lmaWVkIG1hdGNoIHdpbGwgb25seSBzZWxlY3QgcGFja2V0cyB0aGF0IG1hdGNoIHRoZSBleGFjdCB2YWx1ZSBvZiBnZXRWYWx1ZShmaWVsZCkuCisgICAgICogCisgICAgICogQHBhcmFtIGZpZWxkIE1hdGNoIGZpZWxkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBmaWVsZCBoYXMgYSBzcGVjaWZpYyBleGFjdCB2YWx1ZSwgZmFsc2UgaWYgbm90LgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgZmllbGQgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4YWN0KE1hdGNoRmllbGQ8Pz4gZmllbGQpOworICAgIHB1YmxpYyBib29sZWFuIGlzRXhhY3QoTWF0Y2hGaWVsZDw/PiBmaWVsZCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOwogCiAgICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBsb2dpY2FsbHkgdW5zcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUsIHRoZQotICAgICAqIHZhbHVlIHJldHVybmVkIGJ5IGdldFZhbHVlKGYpIGhhcyBubyBpbXBhY3Qgb24gd2hldGhlciBhIHBhY2tldCB3aWxsIGJlIHNlbGVjdGVkCisgICAgICogVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBsb2dpY2FsbHkgdW5zcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUsIHRoZSAKKyAgICAgKiB2YWx1ZSByZXR1cm5lZCBieSBnZXRWYWx1ZShmKSBoYXMgbm8gaW1wYWN0IG9uIHdoZXRoZXIgYSBwYWNrZXQgd2lsbCBiZSBzZWxlY3RlZCAKICAgICAgKiBieSB0aGUgbWF0Y2ggb3Igbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIGZpZWxkCi0gICAgICogQHJldHVybgorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZmllbGQgaXMgZnVsbHkgd2lsZGNhcmRlZCwgZmFsc2UgaWYgbm90LgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgZmllbGQgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5V2lsZGNhcmRlZChNYXRjaEZpZWxkPD8+IGZpZWxkKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5V2lsZGNhcmRlZChNYXRjaEZpZWxkPD8+IGZpZWxkKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CiAKICAgICAvKioKLSAgICAgKiBUcnVlIGlmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IHBhcnRpYWxseSBzcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUsIHRoZQotICAgICAqIG1hdGNoIHdpbGwgc2VsZWN0IHBhY2tldHMgdGhhdCBtYXRjaCAocC52YWx1ZSAmIGdldE1hc2soZmllbGQpKSA9PSBnZXRWYWx1ZShmaWVsZCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiBAcmV0dXJuCisgICAgICogVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBwYXJ0aWFsbHkgc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLCB0aGUgCisgICAgICogbWF0Y2ggd2lsbCBvbmx5IHNlbGVjdCBwYWNrZXRzIHRoYXQgbWF0Y2ggKHAudmFsdWUgJiBnZXRNYXNrKGZpZWxkKSkgPT0gZ2V0VmFsdWUoZmllbGQpLAorICAgICAqIGFuZCBnZXRNYXNrKGZpZWxkKSAhPSAwLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZmllbGQgaXMgcGFydGlhbGx5IG1hc2tlZCwgZmFsc2UgaWYgbm90LgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgZmllbGQgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxseU1hc2tlZChNYXRjaEZpZWxkPD8+IGZpZWxkKTsKLQorICAgIHB1YmxpYyBib29sZWFuIGlzUGFydGlhbGx5TWFza2VkKE1hdGNoRmllbGQ8Pz4gZmllbGQpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKKyAgICAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgYnVpbGRlciB0byBidWlsZCBuZXcgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSBvZiBtYXRjaCBvYmplY3QuCiAgICAgICogQHJldHVybiBNYXRjaCBidWlsZGVyCiAgICAgICovCi0gICAgcHVibGljIE1hdGNoQnVpbGRlciBjcmVhdGVCdWlsZGVyKCk7CisgICAgcHVibGljIEJ1aWxkZXIgY3JlYXRlQnVpbGRlcigpOwogCi0gICAgaW50ZXJmYWNlIEJ1aWxkZXIgZXh0ZW5kcyBNYXRjaEJ1aWxkZXIgeworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgaW50ZXJmYWNlIGZvciBNYXRjaCBvYmplY3RzLgorICAgICAqIEJ1aWxkZXIgaXMgdXNlZCB0byBjcmVhdGUgbmV3IE1hdGNoIG9iamVjdHMgYW5kIGl0IGNyZWF0ZXMgdGhlIG1hdGNoIGFjY29yZGluZyB0byB0aGUgdmVyc2lvbiBpdAorICAgICAqIGNvcnJlc3BvbmRzIHRvLiBUaGUgYnVpbGRlciB1c2VzIHRoZSBzYW1lIG5vdGF0aW9uIG9mIHdpbGRjYXJkcyBhbmQgbWFza3MsIGFuZCBjYW4gYWxzbyB0aHJvdworICAgICAqIDxjb2RlPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBpZiBpdCBpcyBhc2tlZCB0byBjcmVhdGUgc29tZSBtYXRjaGluZyB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgaW4KKyAgICAgKiB0aGUgdmVyc2lvbiBpdCByZXByZXNlbnRzLgorICAgICAqIAorICAgICAqIFdoaWxlIHVzZWQsIE1hdGNoQnVpbGRlciBtYXkgbm90IGJlIGNvbnNpc3RlbnQgaW4gdGVybXMgb2YgZmllbGQgcHJlcmVxdWlzaXRlcy4gSG93ZXZlciwgdXNlciBtdXN0CisgICAgICogc29sdmUgdGhlc2UgYmVmb3JlIHVzaW5nIHRoZSBnZW5lcmF0ZWQgTWF0Y2ggb2JqZWN0IGFzIHRoZXNlIHByZXJlcXVpc2l0ZXMgc2hvdWxkIGJlIGVuZm9yY2VkIGluIHRoZQorICAgICAqIGdldHRlcnMuIAorICAgICAqIAorICAgICAqIEBhdXRob3IgWW90YW0gSGFyY2hvbCAoeW90YW0uaGFyY2hvbEBiaWdzd2l0Y2guY29tKQorICAgICAqLworICAgIGludGVyZmFjZSBCdWlsZGVyIGV4dGVuZHMgTWF0Y2ggeworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhIHNwZWNpZmljIGV4YWN0IHZhbHVlIGZvciBhIGZpZWxkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGZpZWxkIE1hdGNoIGZpZWxkIHRvIHNldC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlIG9mIG1hdGNoIGZpZWxkLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBCdWlsZGVyIGluc3RhbmNlIHVzZWQuCisgICAgICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgZmllbGQgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBCdWlsZGVyIHNldEV4YWN0KE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhIG1hc2tlZCB2YWx1ZSBmb3IgYSBmaWVsZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZCB0byBzZXQuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiBmaWVsZC4KKyAgICAgICAgICogQHBhcmFtIG1hc2sgTWFzayB2YWx1ZS4KKyAgICAgICAgICogQHJldHVybiB0aGUgQnVpbGRlciBpbnN0YW5jZSB1c2VkLgorICAgICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIElmIGZpZWxkIGlzIG5vdCBzdXBwb3J0ZWQsIGlmIGZpZWxkIGlzIHN1cHBvcnRlZCBidXQgZG9lcyBub3Qgc3VwcG9ydCBtYXNraW5nLCBvciBpZiBtYXNrIHN0cnVjdHVyZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IEJ1aWxkZXIgc2V0TWFza2VkKE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUsIEYgbWFzaykgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIGEgbWFza2VkIHZhbHVlIGZvciBhIGZpZWxkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGZpZWxkIE1hdGNoIGZpZWxkIHRvIHNldC4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlV2l0aE1hc2sgQ29tcG91bmQgTWFza2VkIG9iamVjdCBjb250YWlucyB0aGUgdmFsdWUgYW5kIHRoZSBtYXNrLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBCdWlsZGVyIGluc3RhbmNlIHVzZWQuCisgICAgICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgZmllbGQgaXMgbm90IHN1cHBvcnRlZCwgaWYgZmllbGQgaXMgc3VwcG9ydGVkIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IG1hc2tpbmcsIG9yIGlmIG1hc2sgc3RydWN0dXJlIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gQnVpbGRlciBzZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCwgTWFza2VkPEY+IHZhbHVlV2l0aE1hc2spIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVW5zZXRzIGFueSB2YWx1ZSBnaXZlbiBmb3IgdGhlIGZpZWxkIGFuZCB3aWxkY2FyZHMgaXQgc28gdGhhdCBpdCBtYXRjaGVzIGFueSB2YWx1ZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZCB0byB1bnNldC4KKyAgICAgICAgICogQHJldHVybiB0aGUgQnVpbGRlciBpbnN0YW5jZSB1c2VkLgorICAgICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIElmIGZpZWxkIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gQnVpbGRlciB3aWxkY2FyZChNYXRjaEZpZWxkPEY+IGZpZWxkKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIG1hdGNoIGNyZWF0ZWQgYnkgdGhpcyBidWlsZGVyLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBhIE1hdGNoIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNYXRjaCBnZXRNYXRjaCgpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9NYXRjaEJ1aWxkZXIuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTdiOGIwLi4wMDAwMDAwCi0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotcGFja2FnZSBvcmcub3BlbmZsb3cucHJvdG9jb2wubWF0Y2g7Ci0KLWltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuTWFza2VkOwotaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRlZhbHVlVHlwZTsKLQotcHVibGljIGludGVyZmFjZSBNYXRjaEJ1aWxkZXIgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQgZnJvbSB0aGlzIG1hdGNoLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpZWxkIE1hdGNoIGZpZWxkIHRvIHJldHJpZXZlCi0gICAgICogQHJldHVybiBWYWx1ZSBvZiBtYXRjaCBmaWVsZAotICAgICAqLwotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBGIGdldChNYXRjaEZpZWxkPEY+IGZpZWxkKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXNrZWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZCBmcm9tIHRoaXMgbWF0Y2guCi0gICAgICogUHJlY29uZGl0aW9uOiBmaWVsZCBpcyBwYXJ0aWFsbHkgd2lsZGNhcmRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZCB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gTWFza2VkIHZhbHVlIG9mIG1hdGNoIGZpZWxkIG9yIG51bGwgaWYgbm8gbWFzawotICAgICAqLwotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXNrZWQ8Rj4gZ2V0TWFza2VkKE1hdGNoRmllbGQ8Rj4gZmllbGQpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hdGNoIG9iamVjdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gbWF0Y2ggZmllbGQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoTWF0Y2hGaWVsZDw/PiBmaWVsZCk7Ci0KLSAgICAvKioKLSAgICAgKiB0cnVlIGlmZiBmaWVsZCBzdXBwb3J0cyBhIGJpdG1hc2sgbWFzayB0aGF0IHdpbGRjYXJkcyBwYXJ0IG9mIHRoZSBmaWVsZAotICAgICAqIChub3RlOiBub3QgYWxsIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGlzIGJpdG1hc2sgaGF2ZSB0byBiZSBhY2NlcHRhYmxlKQotICAgICAqCi0gICAgICogQHBhcmFtIGZpZWxkIE1hdGNoIGZpZWxkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWFza2VkKE1hdGNoRmllbGQ8Pz4gZmllbGQpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZmYgdGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgZnVsbHkgc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLiwgdGhlCi0gICAgICogbWF0Y2ggd2lsbCBvbmx5IHNlbGVjdCBwYWNrZXRzIHRoYXQgbWF0Y2ggdGhlIGV4YWN0IHZhbHVlIG9mIGdldEZpZWxkKGZpZWxkKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4YWN0KE1hdGNoRmllbGQ8Pz4gZmllbGQpOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBsb2dpY2FsbHkgdW5zcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUsIHRoZQotICAgICAqIHZhbHVlIHJldHVybmVkIGJ5IGdldFZhbHVlKGYpIGhhcyBubyBpbXBhY3Qgb24gd2hldGhlciBhIHBhY2tldCB3aWxsIGJlIHNlbGVjdGVkCi0gICAgICogYnkgdGhlIG1hdGNoIG9yIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5V2lsZGNhcmRlZChNYXRjaEZpZWxkPD8+IGZpZWxkKTsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgdGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgcGFydGlhbGx5IHNwZWNpZmllZCBpbiB0aGUgbWF0Y2gsIGkuZSwgdGhlCi0gICAgICogbWF0Y2ggd2lsbCBzZWxlY3QgcGFja2V0cyB0aGF0IG1hdGNoIChwLnZhbHVlICYgZ2V0TWFzayhmaWVsZCkpID09IGdldFZhbHVlKGZpZWxkKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxseU1hc2tlZChNYXRjaEZpZWxkPD8+IGZpZWxkKTsKLQotCi0gICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoQnVpbGRlciBzZXRFeGFjdChNYXRjaEZpZWxkPEY+IGZpZWxkLCBGIHZhbHVlKTsKLQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0TWFza2VkKE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUsIEYgbWFzayk7Ci0KLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZChNYXRjaEZpZWxkPEY+IGZpZWxkLCBNYXNrZWQ8Rj4gdmFsdWVXaXRoTWFzayk7Ci0KLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHdpbGRjYXJkKE1hdGNoRmllbGQ8Rj4gZmllbGQpOwotCi0gICAgcHVibGljIE1hdGNoIGdldE1hdGNoKCk7Ci19CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9NYXRjaEZpZWxkLmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9NYXRjaEZpZWxkLmphdmEKaW5kZXggNGQ0OTM1Yy4uZWIwMmJjMyAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2hGaWVsZC5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoRmllbGQuamF2YQpAQCAtMTEsMzAgKzExLDM4IEBACiBpbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLklwRWNuOwogaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5JcFByb3RvY29sOwogaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5NYWNBZGRyZXNzOworaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRk1ldGFkYXRhOwogaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRlBvcnQ7CiBpbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk9GVmFsdWVUeXBlOwogaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5UcmFuc3BvcnRQb3J0OwogaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5WbGFuUGNwOwogaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5WbGFuVmlkOwogCitAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIHB1YmxpYyBjbGFzcyBNYXRjaEZpZWxkPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gewogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CiAgICAgcHVibGljIGZpbmFsIE1hdGNoRmllbGRzIGlkOworICAgIHByaXZhdGUgZmluYWwgUHJlcmVxdWlzaXRlPD8+W10gcHJlcmVxdWlzaXRlczsKIAotICAgIHByaXZhdGUgTWF0Y2hGaWVsZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgTWF0Y2hGaWVsZHMgaWQpIHsKKyAgICBwcml2YXRlIE1hdGNoRmllbGQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE1hdGNoRmllbGRzIGlkLCBQcmVyZXF1aXNpdGU8Pz4uLi4gcHJlcmVxdWlzaXRlcykgewogICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMucHJlcmVxdWlzaXRlcyA9IHByZXJlcXVpc2l0ZXM7CiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBNYXRjaEZpZWxkPE9GUG9ydD4gSU5fUE9SVCA9CiAgICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxPRlBvcnQ+KCJpbl9wb3J0IiwgTWF0Y2hGaWVsZHMuSU5fUE9SVCk7CisgICAgCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBNYXRjaEZpZWxkPE9GUG9ydD4gSU5fUEhZX1BPUlQgPQotICAgICAgICAgICAgbmV3IE1hdGNoRmllbGQ8T0ZQb3J0PigiaW5fcGh5X3BvcnQiLCBNYXRjaEZpZWxkcy5QSFlTSUNBTF9QT1JUKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIE1hdGNoRmllbGQ8T0ZQb3J0PiBNRVRBREFUQSA9Ci0gICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxPRlBvcnQ+KCJtZXRhZGF0YSIsIE1hdGNoRmllbGRzLk1FVEFEQVRBKTsKKyAgICAgICAgICAgIG5ldyBNYXRjaEZpZWxkPE9GUG9ydD4oImluX3BoeV9wb3J0IiwgTWF0Y2hGaWVsZHMuUEhZU0lDQUxfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFByZXJlcXVpc2l0ZTxPRlBvcnQ+KE1hdGNoRmllbGQuSU5fUE9SVCkpOworICAgIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTWF0Y2hGaWVsZDxPRk1ldGFkYXRhPiBNRVRBREFUQSA9CisgICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxPRk1ldGFkYXRhPigibWV0YWRhdGEiLCBNYXRjaEZpZWxkcy5NRVRBREFUQSk7CiAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE1hdGNoRmllbGQ8TWFjQWRkcmVzcz4gRVRIX0RTVCA9CiAgICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxNYWNBZGRyZXNzPigiZXRoX2RzdCIsIE1hdGNoRmllbGRzLkVUSF9EU1QpOworICAgIAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTWF0Y2hGaWVsZDxNYWNBZGRyZXNzPiBFVEhfU1JDID0KICAgICAgICAgICAgIG5ldyBNYXRjaEZpZWxkPE1hY0FkZHJlc3M+KCJldGhfc3JjIiwgTWF0Y2hGaWVsZHMuRVRIX1NSQyk7CiAKQEAgLTQzLDYzICs1MSwxMDYgQEAKICAgICAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE1hdGNoRmllbGQ8VmxhblZpZD4gVkxBTl9WSUQgPQogICAgICAgICAgICAgbmV3IE1hdGNoRmllbGQ8VmxhblZpZD4oInZsYW5fdmlkIiwgTWF0Y2hGaWVsZHMuVkxBTl9WSUQpOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTWF0Y2hGaWVsZDxWbGFuUGNwPiBWTEFOX1BDUCA9Ci0gICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxWbGFuUGNwPigidmxhbl9wY3AiLCBNYXRjaEZpZWxkcy5WTEFOX1BDUCk7CiAgICAgCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBNYXRjaEZpZWxkPFZsYW5QY3A+IFZMQU5fUENQID0KKyAgICAgICAgICAgIG5ldyBNYXRjaEZpZWxkPFZsYW5QY3A+KCJ2bGFuX3BjcCIsIE1hdGNoRmllbGRzLlZMQU5fUENQLAorICAgICAgICAgICAgICAgICAgICBuZXcgUHJlcmVxdWlzaXRlPFZsYW5WaWQ+KE1hdGNoRmllbGQuVkxBTl9WSUQpKTsKICAgICAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE1hdGNoRmllbGQ8SXBEc2NwPiBJUF9EU0NQID0KLSAgICAgICAgICAgIG5ldyBNYXRjaEZpZWxkPElwRHNjcD4oImlwX2RzY3AiLCBNYXRjaEZpZWxkcy5JUF9EU0NQKTsKKyAgICAgICAgICAgIG5ldyBNYXRjaEZpZWxkPElwRHNjcD4oImlwX2RzY3AiLCBNYXRjaEZpZWxkcy5JUF9EU0NQLAorICAgICAgICAgICAgICAgICAgICBuZXcgUHJlcmVxdWlzaXRlPEV0aFR5cGU+KE1hdGNoRmllbGQuRVRIX1RZUEUsIEV0aFR5cGUuRVRIX1RZUEVfSVB2NCwgRXRoVHlwZS5FVEhfVFlQRV9JUHY2KSk7CisgICAgCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBNYXRjaEZpZWxkPElwRWNuPiBJUF9FQ04gPQotICAgICAgICAgICAgbmV3IE1hdGNoRmllbGQ8SXBFY24+KCJpcF9kc2NwIiwgTWF0Y2hGaWVsZHMuSVBfRUNOKTsKKyAgICAgICAgICAgIG5ldyBNYXRjaEZpZWxkPElwRWNuPigiaXBfZHNjcCIsIE1hdGNoRmllbGRzLklQX0VDTiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFByZXJlcXVpc2l0ZTxFdGhUeXBlPihNYXRjaEZpZWxkLkVUSF9UWVBFLCBFdGhUeXBlLkVUSF9UWVBFX0lQdjQsIEV0aFR5cGUuRVRIX1RZUEVfSVB2NikpOworICAgIAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTWF0Y2hGaWVsZDxJcFByb3RvY29sPiBJUF9QUk9UTyA9Ci0gICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxJcFByb3RvY29sPigiaXBfcHJvdG8iLCBNYXRjaEZpZWxkcy5JUF9QUk9UTyk7CisgICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxJcFByb3RvY29sPigiaXBfcHJvdG8iLCBNYXRjaEZpZWxkcy5JUF9QUk9UTywKKyAgICAgICAgICAgICAgICAgICAgbmV3IFByZXJlcXVpc2l0ZTxFdGhUeXBlPihNYXRjaEZpZWxkLkVUSF9UWVBFLCBFdGhUeXBlLkVUSF9UWVBFX0lQdjQsIEV0aFR5cGUuRVRIX1RZUEVfSVB2NikpOwogCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBNYXRjaEZpZWxkPElQdjQ+IElQVjRfU1JDID0KLSAgICAgICAgICAgIG5ldyBNYXRjaEZpZWxkPElQdjQ+KCJpcHY0X3NyYyIsIE1hdGNoRmllbGRzLklQVjRfU1JDKTsKKyAgICAgICAgICAgIG5ldyBNYXRjaEZpZWxkPElQdjQ+KCJpcHY0X3NyYyIsIE1hdGNoRmllbGRzLklQVjRfU1JDLAorICAgICAgICAgICAgICAgICAgICBuZXcgUHJlcmVxdWlzaXRlPEV0aFR5cGU+KE1hdGNoRmllbGQuRVRIX1RZUEUsIEV0aFR5cGUuRVRIX1RZUEVfSVB2NCkpOworICAgIAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTWF0Y2hGaWVsZDxJUHY0PiBJUFY0X0RTVCA9Ci0gICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxJUHY0PigiaXB2NF9kc3QiLCBNYXRjaEZpZWxkcy5JUFY0X0RTVCk7CisgICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxJUHY0PigiaXB2NF9kc3QiLCBNYXRjaEZpZWxkcy5JUFY0X0RTVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFByZXJlcXVpc2l0ZTxFdGhUeXBlPihNYXRjaEZpZWxkLkVUSF9UWVBFLCBFdGhUeXBlLkVUSF9UWVBFX0lQdjQpKTsKIAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTWF0Y2hGaWVsZDxUcmFuc3BvcnRQb3J0PiBUQ1BfU1JDID0gbmV3IE1hdGNoRmllbGQ8VHJhbnNwb3J0UG9ydD4oCi0gICAgICAgICAgICAidGNwX3NyYyIsIE1hdGNoRmllbGRzLlRDUF9TUkMpOworICAgICAgICAgICAgInRjcF9zcmMiLCBNYXRjaEZpZWxkcy5UQ1BfU1JDLAorICAgICAgICAgICAgbmV3IFByZXJlcXVpc2l0ZTxJcFByb3RvY29sPihNYXRjaEZpZWxkLklQX1BST1RPLCBJcFByb3RvY29sLklQX1BST1RPX1RDUCkpOworICAgIAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTWF0Y2hGaWVsZDxUcmFuc3BvcnRQb3J0PiBUQ1BfRFNUID0gbmV3IE1hdGNoRmllbGQ8VHJhbnNwb3J0UG9ydD4oCi0gICAgICAgICAgICAidGNwX2RzdCIsIE1hdGNoRmllbGRzLlRDUF9EU1QpOworICAgICAgICAgICAgInRjcF9kc3QiLCBNYXRjaEZpZWxkcy5UQ1BfRFNULAorICAgICAgICAgICAgbmV3IFByZXJlcXVpc2l0ZTxJcFByb3RvY29sPihNYXRjaEZpZWxkLklQX1BST1RPLCBJcFByb3RvY29sLklQX1BST1RPX1RDUCkpOwogCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBNYXRjaEZpZWxkPFRyYW5zcG9ydFBvcnQ+IFVEUF9TUkMgPSBuZXcgTWF0Y2hGaWVsZDxUcmFuc3BvcnRQb3J0PigKLSAgICAgICAgICAgICJ1ZHBfc3JjIiwgTWF0Y2hGaWVsZHMuVURQX1NSQyk7CisgICAgICAgICAgICAidWRwX3NyYyIsIE1hdGNoRmllbGRzLlVEUF9TUkMsCisgICAgICAgICAgICBuZXcgUHJlcmVxdWlzaXRlPElwUHJvdG9jb2w+KE1hdGNoRmllbGQuSVBfUFJPVE8sIElwUHJvdG9jb2wuSVBfUFJPVE9fVURQKSk7CisgICAgCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBNYXRjaEZpZWxkPFRyYW5zcG9ydFBvcnQ+IFVEUF9EU1QgPSBuZXcgTWF0Y2hGaWVsZDxUcmFuc3BvcnRQb3J0PigKLSAgICAgICAgICAgICJ1ZHBfZHN0IiwgTWF0Y2hGaWVsZHMuVURQX0RTVCk7CisgICAgICAgICAgICAidWRwX2RzdCIsIE1hdGNoRmllbGRzLlVEUF9EU1QsCisgICAgICAgICAgICBuZXcgUHJlcmVxdWlzaXRlPElwUHJvdG9jb2w+KE1hdGNoRmllbGQuSVBfUFJPVE8sIElwUHJvdG9jb2wuSVBfUFJPVE9fVURQKSk7CiAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE1hdGNoRmllbGQ8VHJhbnNwb3J0UG9ydD4gU0NUUF9TUkMgPSBuZXcgTWF0Y2hGaWVsZDxUcmFuc3BvcnRQb3J0PigKLSAgICAgICAgICAgICJzY3RwX3NyYyIsIE1hdGNoRmllbGRzLlNDVFBfU1JDKTsKKyAgICAgICAgICAgICJzY3RwX3NyYyIsIE1hdGNoRmllbGRzLlNDVFBfU1JDLAorICAgICAgICAgICAgbmV3IFByZXJlcXVpc2l0ZTxJcFByb3RvY29sPihNYXRjaEZpZWxkLklQX1BST1RPLCBJcFByb3RvY29sLklQX1BST1RPX1NDVFApKTsKKyAgICAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE1hdGNoRmllbGQ8VHJhbnNwb3J0UG9ydD4gU0NUUF9EU1QgPSBuZXcgTWF0Y2hGaWVsZDxUcmFuc3BvcnRQb3J0PigKLSAgICAgICAgICAgICJzY3RwX2RzdCIsIE1hdGNoRmllbGRzLlNDVFBfRFNUKTsKKyAgICAgICAgICAgICJzY3RwX2RzdCIsIE1hdGNoRmllbGRzLlNDVFBfRFNULAorICAgICAgICAgICAgbmV3IFByZXJlcXVpc2l0ZTxJcFByb3RvY29sPihNYXRjaEZpZWxkLklQX1BST1RPLCBJcFByb3RvY29sLklQX1BST1RPX1NDVFApKTsKIAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTWF0Y2hGaWVsZDxJQ01QdjRUeXBlPiBJQ01QVjRfVFlQRSA9IG5ldyBNYXRjaEZpZWxkPElDTVB2NFR5cGU+KAotICAgICAgICAgICAgImljbXB2NF9zcmMiLCBNYXRjaEZpZWxkcy5JQ01QVjRfVFlQRSk7CisgICAgICAgICAgICAiaWNtcHY0X3NyYyIsIE1hdGNoRmllbGRzLklDTVBWNF9UWVBFLAorICAgICAgICAgICAgbmV3IFByZXJlcXVpc2l0ZTxJcFByb3RvY29sPihNYXRjaEZpZWxkLklQX1BST1RPLCBJcFByb3RvY29sLklQX1BST1RPX0lDTVApKTsKKyAgICAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE1hdGNoRmllbGQ8SUNNUHY0Q29kZT4gSUNNUFY0X0NPREUgPSBuZXcgTWF0Y2hGaWVsZDxJQ01QdjRDb2RlPigKLSAgICAgICAgICAgICJpY21wdjRfZHN0IiwgTWF0Y2hGaWVsZHMuSUNNUFY0X0NPREUpOworICAgICAgICAgICAgImljbXB2NF9kc3QiLCBNYXRjaEZpZWxkcy5JQ01QVjRfQ09ERSwKKyAgICAgICAgICAgIG5ldyBQcmVyZXF1aXNpdGU8SXBQcm90b2NvbD4oTWF0Y2hGaWVsZC5JUF9QUk9UTywgSXBQcm90b2NvbC5JUF9QUk9UT19JQ01QKSk7CiAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE1hdGNoRmllbGQ8QXJwT3Bjb2RlPiBBUlBfT1AgPSBuZXcgTWF0Y2hGaWVsZDxBcnBPcGNvZGU+KAotICAgICAgICAgICAgImFycF9vcCIsIE1hdGNoRmllbGRzLkFSUF9PUCk7CisgICAgICAgICAgICAiYXJwX29wIiwgTWF0Y2hGaWVsZHMuQVJQX09QLAorICAgICAgICAgICAgbmV3IFByZXJlcXVpc2l0ZTxFdGhUeXBlPihNYXRjaEZpZWxkLkVUSF9UWVBFLCBFdGhUeXBlLkVUSF9UWVBFX0FSUCkpOworICAgIAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTWF0Y2hGaWVsZDxJUHY0PiBBUlBfU1BBID0KLSAgICAgICAgICAgIG5ldyBNYXRjaEZpZWxkPElQdjQ+KCJhcnBfc3BhIiwgTWF0Y2hGaWVsZHMuQVJQX1NQQSk7CisgICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxJUHY0PigiYXJwX3NwYSIsIE1hdGNoRmllbGRzLkFSUF9TUEEsCisgICAgICAgICAgICAgICAgICAgIG5ldyBQcmVyZXF1aXNpdGU8RXRoVHlwZT4oTWF0Y2hGaWVsZC5FVEhfVFlQRSwgRXRoVHlwZS5FVEhfVFlQRV9BUlApKTsKKyAgICAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE1hdGNoRmllbGQ8SVB2ND4gQVJQX1RQQSA9Ci0gICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxJUHY0PigiYXJwX3RwYSIsIE1hdGNoRmllbGRzLkFSUF9UUEEpOworICAgICAgICAgICAgbmV3IE1hdGNoRmllbGQ8SVB2ND4oImFycF90cGEiLCBNYXRjaEZpZWxkcy5BUlBfVFBBLAorICAgICAgICAgICAgICAgICAgICBuZXcgUHJlcmVxdWlzaXRlPEV0aFR5cGU+KE1hdGNoRmllbGQuRVRIX1RZUEUsIEV0aFR5cGUuRVRIX1RZUEVfQVJQKSk7CisgICAgCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBNYXRjaEZpZWxkPE1hY0FkZHJlc3M+IEFSUF9TSEEgPQotICAgICAgICAgICAgbmV3IE1hdGNoRmllbGQ8TWFjQWRkcmVzcz4oImFycF9zaGEiLCBNYXRjaEZpZWxkcy5BUlBfU0hBKTsKKyAgICAgICAgICAgIG5ldyBNYXRjaEZpZWxkPE1hY0FkZHJlc3M+KCJhcnBfc2hhIiwgTWF0Y2hGaWVsZHMuQVJQX1NIQSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFByZXJlcXVpc2l0ZTxFdGhUeXBlPihNYXRjaEZpZWxkLkVUSF9UWVBFLCBFdGhUeXBlLkVUSF9UWVBFX0FSUCkpOworICAgIAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTWF0Y2hGaWVsZDxNYWNBZGRyZXNzPiBBUlBfVEhBID0KLSAgICAgICAgICAgIG5ldyBNYXRjaEZpZWxkPE1hY0FkZHJlc3M+KCJhcnBfdGhhIiwgTWF0Y2hGaWVsZHMuQVJQX1RIQSk7CisgICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxNYWNBZGRyZXNzPigiYXJwX3RoYSIsIE1hdGNoRmllbGRzLkFSUF9USEEsCisgICAgICAgICAgICAgICAgICAgIG5ldyBQcmVyZXF1aXNpdGU8RXRoVHlwZT4oTWF0Y2hGaWVsZC5FVEhfVFlQRSwgRXRoVHlwZS5FVEhfVFlQRV9BUlApKTsKIAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTWF0Y2hGaWVsZDxJUHY2PiBJUFY2X1NSQyA9Ci0gICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxJUHY2PigiaXB2Nl9zcmMiLCBNYXRjaEZpZWxkcy5JUFY2X1NSQyk7CisgICAgICAgICAgICBuZXcgTWF0Y2hGaWVsZDxJUHY2PigiaXB2Nl9zcmMiLCBNYXRjaEZpZWxkcy5JUFY2X1NSQywKKyAgICAgICAgICAgICAgICAgICAgbmV3IFByZXJlcXVpc2l0ZTxFdGhUeXBlPihNYXRjaEZpZWxkLkVUSF9UWVBFLCBFdGhUeXBlLkVUSF9UWVBFX0lQdjYpKTsKKyAgICAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE1hdGNoRmllbGQ8SVB2Nj4gSVBWNl9EU1QgPQotICAgICAgICAgICAgbmV3IE1hdGNoRmllbGQ8SVB2Nj4oImlwdjZfZHN0IiwgTWF0Y2hGaWVsZHMuSVBWNl9EU1QpOworICAgICAgICAgICAgbmV3IE1hdGNoRmllbGQ8SVB2Nj4oImlwdjZfZHN0IiwgTWF0Y2hGaWVsZHMuSVBWNl9EU1QsCisgICAgICAgICAgICAgICAgICAgIG5ldyBQcmVyZXF1aXNpdGU8RXRoVHlwZT4oTWF0Y2hGaWVsZC5FVEhfVFlQRSwgRXRoVHlwZS5FVEhfVFlQRV9JUHY2KSk7CiAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIE1hdGNoRmllbGQ8SVB2NkZsb3dMYWJlbD4gSVBWNl9GTEFCRUwgPQotICAgICAgICAgICAgbmV3IE1hdGNoRmllbGQ8SVB2NkZsb3dMYWJlbD4oImlwdjZfZmxhYmVsIiwgTWF0Y2hGaWVsZHMuSVBWNl9GTE9XTEFCRUwpOworICAgICAgICAgICAgbmV3IE1hdGNoRmllbGQ8SVB2NkZsb3dMYWJlbD4oImlwdjZfZmxhYmVsIiwgTWF0Y2hGaWVsZHMuSVBWNl9GTE9XTEFCRUwsCisgICAgICAgICAgICAgICAgICAgIG5ldyBQcmVyZXF1aXNpdGU8RXRoVHlwZT4oTWF0Y2hGaWVsZC5FVEhfVFlQRSwgRXRoVHlwZS5FVEhfVFlQRV9JUHY2KSk7CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAgICAgICAgIHJldHVybiBuYW1lOwogICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBhcmVQcmVyZXF1aXNpdGVzT0soTWF0Y2ggbWF0Y2gpIHsKKyAgICAgICAgZm9yIChQcmVyZXF1aXNpdGU8Pz4gcCA6IHRoaXMucHJlcmVxdWlzaXRlcykgeworICAgICAgICAgICAgaWYgKCFwLmlzU2F0aXNmaWVkKG1hdGNoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoRmllbGRzLmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9NYXRjaEZpZWxkcy5qYXZhCmluZGV4IDIxMDQzZjIuLjMwOWY5MWYgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL01hdGNoRmllbGRzLmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvcHJvdG9jb2wvbWF0Y2gvTWF0Y2hGaWVsZHMuamF2YQpAQCAtMSw1ICsxLDYgQEAKIHBhY2thZ2Ugb3JnLm9wZW5mbG93LnByb3RvY29sLm1hdGNoOwogCisvLyBNVVNUIEJFIE9SREVSRUQgQlkgVEhFIE9SREVSIE9GIE9GIFNQRUMhISEKIHB1YmxpYyBlbnVtIE1hdGNoRmllbGRzIHsKICAgICBJTl9QT1JULAogICAgIFBIWVNJQ0FMX1BPUlQsCmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9QcmVyZXF1aXNpdGUuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3Byb3RvY29sL21hdGNoL1ByZXJlcXVpc2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YWZjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy9wcm90b2NvbC9tYXRjaC9QcmVyZXF1aXNpdGUuamF2YQpAQCAtMCwwICsxLDQ0IEBACitwYWNrYWdlIG9yZy5vcGVuZmxvdy5wcm90b2NvbC5tYXRjaDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcub3BlbmZsb3cudHlwZXMuT0ZWYWx1ZVR5cGU7CisKK3B1YmxpYyBjbGFzcyBQcmVyZXF1aXNpdGU8VCBleHRlbmRzIE9GVmFsdWVUeXBlPFQ+PiB7CisgICAgcHJpdmF0ZSBNYXRjaEZpZWxkPFQ+IGZpZWxkOworICAgIHByaXZhdGUgU2V0PE9GVmFsdWVUeXBlPFQ+PiB2YWx1ZXM7CisgICAgcHJpdmF0ZSBib29sZWFuIGFueTsKKyAgICAKKyAgICBwdWJsaWMgUHJlcmVxdWlzaXRlKE1hdGNoRmllbGQ8VD4gZmllbGQsIE9GVmFsdWVUeXBlPFQ+Li4uIHZhbHVlcykgeworICAgICAgICB0aGlzLnZhbHVlcyA9IG5ldyBIYXNoU2V0PE9GVmFsdWVUeXBlPFQ+PigpOworICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHRoaXMuYW55ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuYW55ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKE9GVmFsdWVUeXBlPFQ+IHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuYWRkKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwcmVyZXF1aXNpdGUgaXMgc2F0aXNmaWVkIGJ5IHRoZSBnaXZlbiBtYXRjaCBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG1hdGNoIE1hdGNoIG9iamVjdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZmYgcHJlcmVxdWlzaXRlIGlzIHNhdGlzZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdGlzZmllZChNYXRjaCBtYXRjaCkgeworICAgICAgICBPRlZhbHVlVHlwZTxUPiByZXMgPSBtYXRjaC5nZXQodGhpcy5maWVsZCk7CisgICAgICAgIGlmIChyZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMuYW55KQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICh0aGlzLnZhbHVlcy5jb250YWlucyhyZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9BcnBPcGNvZGUuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0FycE9wY29kZS5qYXZhCmluZGV4IDZlYmY0NDcuLjAxZTdiZDggMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0FycE9wY29kZS5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0FycE9wY29kZS5qYXZhCkBAIC0zMiwzNCArMzIsMzcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVJQX09QQ09ERV9WQUxfT1BfRVhQMSAgID0gMjQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFSUF9PUENPREVfVkFMX09QX0VYUDIgICA9IDI1OwogCi0gICAgcHVibGljIHN0YXRpYyBBcnBPcGNvZGUgQVJQX09QQ09ERV9SRVFVRVNUICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfUkVRVUVTVCk7Ci0gICAgcHVibGljIHN0YXRpYyBBcnBPcGNvZGUgQVJQX09QQ09ERV9SRVBMWSAgICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfUkVQTFkpOwotICAgIHB1YmxpYyBzdGF0aWMgQXJwT3Bjb2RlIEFSUF9PUENPREVfUkVRVUVTVF9SRVZFUlNFICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfUkVRVUVTVF9SRVZFUlNFKTsKLSAgICBwdWJsaWMgc3RhdGljIEFycE9wY29kZSBBUlBfT1BDT0RFX1JFUExZX1JFVkVSU0UgICAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX1JFUExZX1JFVkVSU0UpOwotICAgIHB1YmxpYyBzdGF0aWMgQXJwT3Bjb2RlIEFSUF9PUENPREVfRFJBUlBfUkVRVUVTVCAgICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfRFJBUlBfUkVRVUVTVCk7Ci0gICAgcHVibGljIHN0YXRpYyBBcnBPcGNvZGUgQVJQX09QQ09ERV9EUkFSUF9SRVBMWSAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX0RSQVJQX1JFUExZKTsKLSAgICBwdWJsaWMgc3RhdGljIEFycE9wY29kZSBBUlBfT1BDT0RFX0RSQVJQX0VSUk9SICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfRFJBUlBfRVJST1IpOwotICAgIHB1YmxpYyBzdGF0aWMgQXJwT3Bjb2RlIEFSUF9PUENPREVfSU5BUlBfUkVRVUVTVCAgICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfSU5BUlBfUkVRVUVTVCk7Ci0gICAgcHVibGljIHN0YXRpYyBBcnBPcGNvZGUgQVJQX09QQ09ERV9JTkFSUF9SRVBMWSAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX0lOQVJQX1JFUExZKTsKLSAgICBwdWJsaWMgc3RhdGljIEFycE9wY29kZSBBUlBfT1BDT0RFX0FSUF9OQUsgID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9BUlBfTkFLKTsKLSAgICBwdWJsaWMgc3RhdGljIEFycE9wY29kZSBBUlBfT1BDT0RFX01BUlNfUkVRVUVTVCA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfTUFSU19SRVFVRVNUKTsKLSAgICBwdWJsaWMgc3RhdGljIEFycE9wY29kZSBBUlBfT1BDT0RFX01BUlNfTVVMVEkgICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfTUFSU19NVUxUSSk7Ci0gICAgcHVibGljIHN0YXRpYyBBcnBPcGNvZGUgQVJQX09QQ09ERV9NQVJTX01TRVJWICAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX01BUlNfTVNFUlYpOwotICAgIHB1YmxpYyBzdGF0aWMgQXJwT3Bjb2RlIEFSUF9PUENPREVfTUFSU19KT0lOICAgID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9NQVJTX0pPSU4pOwotICAgIHB1YmxpYyBzdGF0aWMgQXJwT3Bjb2RlIEFSUF9PUENPREVfTUFSU19MRUFWRSAgID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9NQVJTX0xFQVZFKTsKLSAgICBwdWJsaWMgc3RhdGljIEFycE9wY29kZSBBUlBfT1BDT0RFX01BUlNfTkFLID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9NQVJTX05BSyk7Ci0gICAgcHVibGljIHN0YXRpYyBBcnBPcGNvZGUgQVJQX09QQ09ERV9NQVJTX1VOU0VSViAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX01BUlNfVU5TRVJWKTsKLSAgICBwdWJsaWMgc3RhdGljIEFycE9wY29kZSBBUlBfT1BDT0RFX01BUlNfU0pPSU4gICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfTUFSU19TSk9JTik7Ci0gICAgcHVibGljIHN0YXRpYyBBcnBPcGNvZGUgQVJQX09QQ09ERV9NQVJTX1NMRUFWRSAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX01BUlNfU0xFQVZFKTsKLSAgICBwdWJsaWMgc3RhdGljIEFycE9wY29kZSBBUlBfT1BDT0RFX01BUlNfR1JPVVBMSVNUX1JFUVVFU1QgICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfTUFSU19HUk9VUExJU1RfUkVRVUVTVCk7Ci0gICAgcHVibGljIHN0YXRpYyBBcnBPcGNvZGUgQVJQX09QQ09ERV9NQVJTX0dST1VQTElTVF9SRVBMWSA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfTUFSU19HUk9VUExJU1RfUkVQTFkpOwotICAgIHB1YmxpYyBzdGF0aWMgQXJwT3Bjb2RlIEFSUF9PUENPREVfTUFSU19SRURJUkVDVF9NQVAgICAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX01BUlNfUkVESVJFQ1RfTUFQKTsKLSAgICBwdWJsaWMgc3RhdGljIEFycE9wY29kZSBBUlBfT1BDT0RFX01BUE9TX1VOQVJQICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfTUFQT1NfVU5BUlApOwotICAgIHB1YmxpYyBzdGF0aWMgQXJwT3Bjb2RlIEFSUF9PUENPREVfT1BfRVhQMSAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX09QX0VYUDEpOwotICAgIHB1YmxpYyBzdGF0aWMgQXJwT3Bjb2RlIEFSUF9PUENPREVfT1BfRVhQMiAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX09QX0VYUDIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJwT3Bjb2RlIEFSUF9PUENPREVfUkVRVUVTVCAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX1JFUVVFU1QpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJwT3Bjb2RlIEFSUF9PUENPREVfUkVQTFkgICAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX1JFUExZKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFycE9wY29kZSBBUlBfT1BDT0RFX1JFUVVFU1RfUkVWRVJTRSAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX1JFUVVFU1RfUkVWRVJTRSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnBPcGNvZGUgQVJQX09QQ09ERV9SRVBMWV9SRVZFUlNFICAgID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9SRVBMWV9SRVZFUlNFKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFycE9wY29kZSBBUlBfT1BDT0RFX0RSQVJQX1JFUVVFU1QgICAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX0RSQVJQX1JFUVVFU1QpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJwT3Bjb2RlIEFSUF9PUENPREVfRFJBUlBfUkVQTFkgID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9EUkFSUF9SRVBMWSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnBPcGNvZGUgQVJQX09QQ09ERV9EUkFSUF9FUlJPUiAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX0RSQVJQX0VSUk9SKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFycE9wY29kZSBBUlBfT1BDT0RFX0lOQVJQX1JFUVVFU1QgICAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX0lOQVJQX1JFUVVFU1QpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJwT3Bjb2RlIEFSUF9PUENPREVfSU5BUlBfUkVQTFkgID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9JTkFSUF9SRVBMWSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnBPcGNvZGUgQVJQX09QQ09ERV9BUlBfTkFLICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfQVJQX05BSyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnBPcGNvZGUgQVJQX09QQ09ERV9NQVJTX1JFUVVFU1QgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX01BUlNfUkVRVUVTVCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnBPcGNvZGUgQVJQX09QQ09ERV9NQVJTX01VTFRJICAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX01BUlNfTVVMVEkpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJwT3Bjb2RlIEFSUF9PUENPREVfTUFSU19NU0VSViAgID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9NQVJTX01TRVJWKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFycE9wY29kZSBBUlBfT1BDT0RFX01BUlNfSk9JTiAgICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfTUFSU19KT0lOKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFycE9wY29kZSBBUlBfT1BDT0RFX01BUlNfTEVBVkUgICA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfTUFSU19MRUFWRSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnBPcGNvZGUgQVJQX09QQ09ERV9NQVJTX05BSyA9IG5ldyBBcnBPcGNvZGUoQVJQX09QQ09ERV9WQUxfTUFSU19OQUspOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJwT3Bjb2RlIEFSUF9PUENPREVfTUFSU19VTlNFUlYgID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9NQVJTX1VOU0VSVik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnBPcGNvZGUgQVJQX09QQ09ERV9NQVJTX1NKT0lOICAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX01BUlNfU0pPSU4pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJwT3Bjb2RlIEFSUF9PUENPREVfTUFSU19TTEVBVkUgID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9NQVJTX1NMRUFWRSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnBPcGNvZGUgQVJQX09QQ09ERV9NQVJTX0dST1VQTElTVF9SRVFVRVNUICAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX01BUlNfR1JPVVBMSVNUX1JFUVVFU1QpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJwT3Bjb2RlIEFSUF9PUENPREVfTUFSU19HUk9VUExJU1RfUkVQTFkgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX01BUlNfR1JPVVBMSVNUX1JFUExZKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFycE9wY29kZSBBUlBfT1BDT0RFX01BUlNfUkVESVJFQ1RfTUFQICAgID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9NQVJTX1JFRElSRUNUX01BUCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnBPcGNvZGUgQVJQX09QQ09ERV9NQVBPU19VTkFSUCAgPSBuZXcgQXJwT3Bjb2RlKEFSUF9PUENPREVfVkFMX01BUE9TX1VOQVJQKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFycE9wY29kZSBBUlBfT1BDT0RFX09QX0VYUDEgID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9PUF9FWFAxKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFycE9wY29kZSBBUlBfT1BDT0RFX09QX0VYUDIgID0gbmV3IEFycE9wY29kZShBUlBfT1BDT0RFX1ZBTF9PUF9FWFAyKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fT1BDT0RFID0gMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX09QQ09ERSA9IDB4RkZGRjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFycE9wY29kZSBOT19NQVNLID0gbmV3IEFycE9wY29kZSgweEZGRkZGRkZGKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFycE9wY29kZSBGVUxMX01BU0sgPSBuZXcgQXJwT3Bjb2RlKDB4MDAwMDAwMDApOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb3Bjb2RlOwogCmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9FdGhUeXBlLmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9FdGhUeXBlLmphdmEKaW5kZXggZWExNmU2Ny4uYzQ1MWE5OSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvRXRoVHlwZS5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0V0aFR5cGUuamF2YQpAQCAtMTAxLDYgKzEwMSw5IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFdGhUeXBlIEVUSF9UWVBFX1FfSU5fUSAgICAgICAgICAgICA9IG5ldyBFdGhUeXBlKEVUSF9UWVBFX1ZBTF9RX0lOX1EgKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV0aFR5cGUgRVRIX1RZUEVfTExUICAgICAgICAgICAgICAgID0gbmV3IEV0aFR5cGUoRVRIX1RZUEVfVkFMX0xMVCApOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFdGhUeXBlIE5PX01BU0sgPSBuZXcgRXRoVHlwZSgweEZGRkZGRkZGKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV0aFR5cGUgRlVMTF9NQVNLID0gbmV3IEV0aFR5cGUoMHgwMDAwMDAwMCk7CisKICAgICBwcml2YXRlIEV0aFR5cGUoaW50IHR5cGUpIHsKICAgICAgICAgdGhpcy5yYXdWYWx1ZSA9IHR5cGU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSUNNUHY0Q29kZS5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSUNNUHY0Q29kZS5qYXZhCmluZGV4IDQyY2M1YmUuLjcyNDE3MGUgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lDTVB2NENvZGUuamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JQ01QdjRDb2RlLmphdmEKQEAgLTEzLDYgKzEzLDkgQEAKICAgICBmaW5hbCBzdGF0aWMgc2hvcnQgTUFYX0NPREUgPSAweEZGOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBjb2RlOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSUNNUHY0Q29kZSBOT19NQVNLID0gbmV3IElDTVB2NENvZGUoKHNob3J0KTB4RkZGRik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJQ01QdjRDb2RlIEZVTExfTUFTSyA9IG5ldyBJQ01QdjRDb2RlKChzaG9ydCkweDAwMDApOwogCiAgICAgcHJpdmF0ZSBJQ01QdjRDb2RlKHNob3J0IGNvZGUpIHsKICAgICAgICAgdGhpcy5jb2RlID0gY29kZTsKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lDTVB2NFR5cGUuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lDTVB2NFR5cGUuamF2YQppbmRleCBiMWJiZGMwLi43YWE0NWQ4IDEwMDY0NAotLS0gYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JQ01QdjRUeXBlLmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSUNNUHY0VHlwZS5qYXZhCkBAIC02NCw2ICs2NCw5IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJQ01QdjRUeXBlIElDTVBWNF9UWVBFX1BIT1RVUklTID0gbmV3IElDTVB2NFR5cGUoSUNNUFY0X1RZUEVfVkFMX1BIT1RVUklTKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElDTVB2NFR5cGUgSUNNUFY0X1RZUEVfRVhQRVJJTUVOVEFMX01PQklMSVRZICAgID0gbmV3IElDTVB2NFR5cGUoSUNNUFY0X1RZUEVfVkFMX0VYUEVSSU1FTlRBTF9NT0JJTElUWSk7CiAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElDTVB2NFR5cGUgTk9fTUFTSyA9IG5ldyBJQ01QdjRUeXBlKChzaG9ydCkweEZGRkYpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSUNNUHY0VHlwZSBGVUxMX01BU0sgPSBuZXcgSUNNUHY0VHlwZSgoc2hvcnQpMHgwMDAwKTsKKwogICAgIHByaXZhdGUgZmluYWwgc2hvcnQgdHlwZTsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1RZUEUgPSAwOwpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSVB2NC5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSVB2NC5qYXZhCmluZGV4IGY4OWY2ODMuLmRhNmYxMjYgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lQdjQuamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JUHY0LmphdmEKQEAgLTEyLDYgKzEyLDkgQEAKIHB1YmxpYyBjbGFzcyBJUHY0IGltcGxlbWVudHMgT0ZWYWx1ZVR5cGU8SVB2ND4gewogICAgIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIID0gNDsKICAgICBwcml2YXRlIGZpbmFsIGludCByYXdWYWx1ZTsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQdjQgTk9fTUFTSyA9IElQdjQub2YoMHhGRkZGRkZGRik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHY0IEZVTExfTUFTSyA9IElQdjQub2YoMHgwMDAwMDAwMCk7CiAKICAgICBwcml2YXRlIElQdjQoZmluYWwgaW50IHJhd1ZhbHVlKSB7CiAgICAgICAgIHRoaXMucmF3VmFsdWUgPSByYXdWYWx1ZTsKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lQdjRXaXRoTWFzay5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSVB2NFdpdGhNYXNrLmphdmEKaW5kZXggYzI0YzRmZC4uNmVhNGFhMSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSVB2NFdpdGhNYXNrLmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSVB2NFdpdGhNYXNrLmphdmEKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgICAgcmV0dXJuIHJlcy50b1N0cmluZygpOwogICAgIH0KICAgICAKLSAgICBwdWJsaWMgc3RhdGljIE9GVmFsdWVUeXBlPD8+IG9mUG9zc2libHlNYXNrZWQoZmluYWwgU3RyaW5nIHN0cmluZykgeworICAgIHB1YmxpYyBzdGF0aWMgSVB2NFdpdGhNYXNrIG9mKGZpbmFsIFN0cmluZyBzdHJpbmcpIHsKICAgICAgICAgaW50IHNsYXNoUG9zOwogICAgICAgICBTdHJpbmcgaXAgPSBzdHJpbmc7CiAgICAgICAgIGludCBtYXNrQml0cyA9IDA7CkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gSVB2NFdpdGhNYXNrLm9mKGlwdjQsIG1hc2tBZGRyZXNzKTsKICAgICAgICAgfSBlbHNlIGlmIChtYXNrQml0cyA9PSAwKSB7CiAgICAgICAgICAgICAvLyBObyBtYXNrCi0gICAgICAgICAgICByZXR1cm4gaXB2NDsKKyAgICAgICAgICAgIHJldHVybiBJUHY0V2l0aE1hc2sub2YoaXB2NCwgSVB2NC5OT19NQVNLKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFdpdGggbWFzawogICAgICAgICAgICAgaW50IG1hc2sgPSAoLTEpIDw8ICgzMiAtIG1hc2tCaXRzKTsKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lQdjYuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lQdjYuamF2YQppbmRleCAyMDBhMzNkLi5iZjBmOWIyIDEwMDY0NAotLS0gYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JUHY2LmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSVB2Ni5qYXZhCkBAIC0xNSw2ICsxNSw5IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBMRU5HVEggPSAxNjsKICAgICBwcml2YXRlIGZpbmFsIGxvbmcgcmF3MTsKICAgICBwcml2YXRlIGZpbmFsIGxvbmcgcmF3MjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQdjYgTk9fTUFTSyA9IElQdjYub2YoMHhGRkZGRkZGRkZGRkZGRkZGbCwgMHhGRkZGRkZGRkZGRkZGRkZGbCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHY2IEZVTExfTUFTSyA9IElQdjYub2YoMHgwLCAweDApOwogCiAgICAgcHJpdmF0ZSBJUHY2KGZpbmFsIGxvbmcgcmF3MSwgZmluYWwgbG9uZyByYXcyKSB7CiAgICAgICAgIHRoaXMucmF3MSA9IHJhdzE7CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JUHY2Rmxvd0xhYmVsLmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JUHY2Rmxvd0xhYmVsLmphdmEKaW5kZXggZDQ5ZTRlMi4uZGVmNTk0NyAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSVB2NkZsb3dMYWJlbC5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lQdjZGbG93TGFiZWwuamF2YQpAQCAtOSw2ICs5LDkgQEAKICAgICAKICAgICBwcml2YXRlIGZpbmFsIGludCBsYWJlbDsKICAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQdjZGbG93TGFiZWwgTk9fTUFTSyA9IElQdjZGbG93TGFiZWwub2YoMHhGRkZGRkZGRik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHY2Rmxvd0xhYmVsIEZVTExfTUFTSyA9IElQdjZGbG93TGFiZWwub2YoMHgwKTsKKyAgICAKICAgICBwcml2YXRlIElQdjZGbG93TGFiZWwoaW50IGxhYmVsKSB7CiAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKICAgICB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JUHY2V2l0aE1hc2suamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lQdjZXaXRoTWFzay5qYXZhCmluZGV4IDcyMzE5ZTMuLmRmZWJlYmEgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lQdjZXaXRoTWFzay5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lQdjZXaXRoTWFzay5qYXZhCkBAIC0zMSw3ICszMSw3IEBACiAgICAgICAgIHJldHVybiByZXMudG9TdHJpbmcoKTsKICAgICB9CiAgICAgCi0gICAgcHVibGljIHN0YXRpYyBPRlZhbHVlVHlwZTw/PiBvZlBvc3NpYmx5TWFza2VkKGZpbmFsIFN0cmluZyBzdHJpbmcpIHsKKyAgICBwdWJsaWMgc3RhdGljIElQdjZXaXRoTWFzayBvZihmaW5hbCBTdHJpbmcgc3RyaW5nKSB7CiAgICAgICAgIGludCBzbGFzaFBvczsKICAgICAgICAgU3RyaW5nIGlwID0gc3RyaW5nOwogICAgICAgICBpbnQgbWFza0JpdHMgPSAwOwpAQCAtNjcsNyArNjcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIElQdjZXaXRoTWFzay5vZihpcHY2LCBtYXNrQWRkcmVzcyk7CiAgICAgICAgIH0gZWxzZSBpZiAobWFza0JpdHMgPT0gMCkgewogICAgICAgICAgICAgLy8gTm8gbWFzawotICAgICAgICAgICAgcmV0dXJuIGlwdjY7CisgICAgICAgICAgICByZXR1cm4gSVB2NldpdGhNYXNrLm9mKGlwdjYsIElQdjYuTk9fTUFTSyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBXaXRoIG1hc2sKICAgICAgICAgICAgIEJpZ0ludGVnZXIgbWFzayA9IEJpZ0ludGVnZXIuT05FLm5lZ2F0ZSgpLnNoaWZ0TGVmdCgxMjggLSBtYXNrQml0cyk7CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JcERzY3AuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lwRHNjcC5qYXZhCmluZGV4IDQ0ZTYyOTYuLjUyNTk4Y2IgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lwRHNjcC5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lwRHNjcC5qYXZhCkBAIC02NywxMCArNjcsMTQgQEAKICAgICBEU0NQXzYwKChieXRlKTYwKSwKICAgICBEU0NQXzYxKChieXRlKTYxKSwKICAgICBEU0NQXzYyKChieXRlKTYyKSwKLSAgICBEU0NQXzYzKChieXRlKTYzKTsKKyAgICBEU0NQXzYzKChieXRlKTYzKSwKKyAgICBEU0NQX05PX01BU0soKGJ5dGUpMHhGRik7CiAgICAgCiAgICAgc3RhdGljIGZpbmFsIGludCBMRU5HVEggPSAxOwogICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSXBEc2NwIE5PX01BU0sgPSBEU0NQX05PX01BU0s7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJcERzY3AgRlVMTF9NQVNLID0gRFNDUF8wOworICAgIAogICAgIHByaXZhdGUgZmluYWwgYnl0ZSBkc2NwOwogICAgIAogICAgIHByaXZhdGUgSXBEc2NwKGJ5dGUgZHNjcCkgewpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSXBFY24uamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lwRWNuLmphdmEKaW5kZXggOTA2MDBkZi4uMGQ5NzIxYyAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSXBFY24uamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JcEVjbi5qYXZhCkBAIC03LDggKzcsMTIgQEAKICAgICBFQ05fMDAoKGJ5dGUpMCksCiAgICAgRUNOXzAxKChieXRlKTEpLAogICAgIEVDTl8xMCgoYnl0ZSkyKSwKLSAgICBFQ05fMTEoKGJ5dGUpMyk7CisgICAgRUNOXzExKChieXRlKTMpLAorICAgIEVDTl9OT19NQVNLKChieXRlKTB4RkYpOwogICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSXBFY24gTk9fTUFTSyA9IEVDTl9OT19NQVNLOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSXBFY24gRlVMTF9NQVNLID0gRUNOXzAwOworCiAgICAgc3RhdGljIGZpbmFsIGludCBMRU5HVEggPSAxOwogICAgIAogICAgIHByaXZhdGUgZmluYWwgYnl0ZSBlY247CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JcFByb3RvY29sLmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JcFByb3RvY29sLmphdmEKaW5kZXggZjQwZWRlZC4uNmZjODk2ZiAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSXBQcm90b2NvbC5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lwUHJvdG9jb2wuamF2YQpAQCAtMjk4LDYgKzI5OCw5IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJcFByb3RvY29sIElQX1BST1RPX0hJUCA9IG5ldyBJcFByb3RvY29sKElQX1BST1RPX05VTV9ISVApOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSXBQcm90b2NvbCBJUF9QUk9UT19TSElNNiA9IG5ldyBJcFByb3RvY29sKElQX1BST1RPX05VTV9TSElNNik7CiAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElwUHJvdG9jb2wgTk9fTUFTSyA9IElQX1BST1RPX0hPUE9QVDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElwUHJvdG9jb2wgRlVMTF9NQVNLID0gbmV3IElwUHJvdG9jb2woKHNob3J0KTB4MDAwMCk7CisKICAgICBwcml2YXRlIElwUHJvdG9jb2woc2hvcnQgdmVyc2lvbikgewogICAgICAgICB0aGlzLnByb3RvID0gdmVyc2lvbjsKICAgICB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9NYWNBZGRyZXNzLmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9NYWNBZGRyZXNzLmphdmEKaW5kZXggY2I4Y2U4NC4uNzcyM2Q2ZiAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvTWFjQWRkcmVzcy5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL01hY0FkZHJlc3MuamF2YQpAQCAtMTQsNiArMTQsOSBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgTWFjQWRkckxlbiA9IDY7CiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHJhd1ZhbHVlOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYWNBZGRyZXNzIE5PX01BU0sgPSBNYWNBZGRyZXNzLm9mKDB4RkZGRkZGRkZGRkZGRkZGRmwpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFjQWRkcmVzcyBGVUxMX01BU0sgPSBNYWNBZGRyZXNzLm9mKDB4MCk7CisKICAgICBwcml2YXRlIE1hY0FkZHJlc3MoZmluYWwgbG9uZyByYXdWYWx1ZSkgewogICAgICAgICB0aGlzLnJhd1ZhbHVlID0gcmF3VmFsdWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvT0ZNZXRhZGF0YS5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvT0ZNZXRhZGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzY3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9PRk1ldGFkYXRhLmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSBvcmcub3BlbmZsb3cudHlwZXM7CisKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuYnVmZmVyLkNoYW5uZWxCdWZmZXI7CisKK3B1YmxpYyBjbGFzcyBPRk1ldGFkYXRhIGV4dGVuZHMgVTY0IGltcGxlbWVudHMgT0ZWYWx1ZVR5cGU8T0ZNZXRhZGF0YT4geworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGludCBMRU5HVEggPSA4OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPRk1ldGFkYXRhIE5PX01BU0sgPSBPRk1ldGFkYXRhLm9mKDB4RkZGRkZGRkZGRkZGRkZGRmwpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT0ZNZXRhZGF0YSBGVUxMX01BU0sgPSBPRk1ldGFkYXRhLm9mKDB4MCk7CisKKyAgICBwcm90ZWN0ZWQgT0ZNZXRhZGF0YShsb25nIHJhdykgeworICAgICAgICBzdXBlcihyYXcpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT0ZNZXRhZGF0YSBvZihsb25nIHJhdykgeworICAgICAgICByZXR1cm4gbmV3IE9GTWV0YWRhdGEocmF3KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBPRk1ldGFkYXRhIHJlYWQ4Qnl0ZXMoQ2hhbm5lbEJ1ZmZlciBjYikgeworICAgICAgICByZXR1cm4gT0ZNZXRhZGF0YS5vZihjYi5yZWFkTG9uZygpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgd3JpdGU4Qnl0ZXMoQ2hhbm5lbEJ1ZmZlciBjYikgeworICAgICAgICBjYi53cml0ZUxvbmcoc3VwZXIuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBMRU5HVEg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9GTWV0YWRhdGEgYXBwbHlNYXNrKE9GTWV0YWRhdGEgbWFzaykgeworICAgICAgICByZXR1cm4gT0ZNZXRhZGF0YS5vZih0aGlzLmdldFZhbHVlKCkgJiBtYXNrLmdldFZhbHVlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL09GUGh5c2ljYWxQb3J0LmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9PRlBoeXNpY2FsUG9ydC5qYXZhCmluZGV4IDZlYjA3YjEuLmQzYjFjOWYgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL09GUGh5c2ljYWxQb3J0LmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvT0ZQaHlzaWNhbFBvcnQuamF2YQpAQCAtMTgsNiArMTgsOSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydDsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT0ZQaHlzaWNhbFBvcnQgTk9fTUFTSyA9IE9GUGh5c2ljYWxQb3J0Lm9mKDB4RkZGRkZGRkYpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT0ZQaHlzaWNhbFBvcnQgRlVMTF9NQVNLID0gT0ZQaHlzaWNhbFBvcnQub2YoMHgwKTsKKwogICAgIHByaXZhdGUgT0ZQaHlzaWNhbFBvcnQoaW50IHBvcnQpIHsKICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKICAgICB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9PRlBvcnQuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL09GUG9ydC5qYXZhCmluZGV4IGY2ZGM0MDguLmVhZjk2ZGUgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL09GUG9ydC5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL09GUG9ydC5qYXZhCkBAIC04Niw2ICs4Niw5IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBPRlBvcnQgQU5ZID0gbmV3IE5hbWVkUG9ydChPRlBQX0FOWV9JTlQsICJhbnkiKTsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT0ZQb3J0IE5PX01BU0sgPSBPRlBvcnQub2YoMHhGRkZGRkZGRik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPRlBvcnQgRlVMTF9NQVNLID0gT0ZQb3J0Lm9mKDB4MCk7CisgICAgCiAgICAgLyoqIGNhY2hlIG9mIGZyZXF1ZW50bHkgdXNlZCBwb3J0cyAqLwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByZWNhY2hlZFBvcnQgewogICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBPRlBvcnQgcDEgPSBuZXcgT0ZQb3J0KDEpOwpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVHJhbnNwb3J0UG9ydC5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVHJhbnNwb3J0UG9ydC5qYXZhCmluZGV4IDgyZGFiNDEuLjJjNTY4N2UgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL1RyYW5zcG9ydFBvcnQuamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9UcmFuc3BvcnRQb3J0LmphdmEKQEAgLTE0LDYgKzE0LDkgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9QT1JUID0gMHhGRkZGOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1BPUlQgPSAwOwogICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNwb3J0UG9ydCBOT19NQVNLID0gVHJhbnNwb3J0UG9ydC5vZigweEZGRkZGRkZGKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zcG9ydFBvcnQgRlVMTF9NQVNLID0gVHJhbnNwb3J0UG9ydC5vZigweDApOworCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydDsKICAgICAKICAgICBwcml2YXRlIFRyYW5zcG9ydFBvcnQoaW50IHBvcnQpIHsKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL1UzMi5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVTMyLmphdmEKaW5kZXggODhkNmIxNS4uNTI3ZTc3OCAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVTMyLmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVTMyLmphdmEKQEAgLTM3LDExICszNywxMSBAQAogICAgICAgICByZXR1cm4gbmV3IFUzMih2YWx1ZSk7CiAgICAgfQogCi0gICAgbG9uZyBnZXRWYWx1ZSgpIHsKKyAgICBwdWJsaWMgbG9uZyBnZXRWYWx1ZSgpIHsKICAgICAgICAgcmV0dXJuIGYocmF3KTsKICAgICB9CiAKLSAgICBpbnQgZ2V0UmF3KCkgeworICAgIHB1YmxpYyBpbnQgZ2V0UmF3KCkgewogICAgICAgICByZXR1cm4gcmF3OwogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVTY0LmphdmEgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VNjQuamF2YQppbmRleCA3NTAzOThmLi43ODcxNDQ1IDEwMDY0NAotLS0gYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VNjQuamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9VNjQuamF2YQpAQCAtMjQsNyArMjQsNyBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHJhdzsKIAotICAgIHByaXZhdGUgVTY0KGZpbmFsIGxvbmcgcmF3KSB7CisgICAgcHJvdGVjdGVkIFU2NChmaW5hbCBsb25nIHJhdykgewogICAgICAgICB0aGlzLnJhdyA9IHJhdzsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL1ZsYW5QY3AuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL1ZsYW5QY3AuamF2YQppbmRleCA1MzFmODc4Li5jY2JhYTYzIDEwMDY0NAotLS0gYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9WbGFuUGNwLmphdmEKKysrIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVmxhblBjcC5qYXZhCkBAIC0xMCw2ICsxMCw5IEBACiAgICAgCiAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIHBjcDsKICAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZsYW5QY3AgTk9fTUFTSyA9IFZsYW5QY3Aub2YoKGJ5dGUpMHhGRik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWbGFuUGNwIEZVTExfTUFTSyA9IFZsYW5QY3Aub2YoKGJ5dGUpMHgwKTsKKyAgICAKICAgICBwcml2YXRlIFZsYW5QY3AoYnl0ZSBwY3ApIHsKICAgICAgICAgdGhpcy5wY3AgPSBwY3A7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVmxhblZpZC5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL21haW4vamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvVmxhblZpZC5qYXZhCmluZGV4IGNhMmMzYzIuLjZhNDBmNDMgMTAwNjQ0Ci0tLSBhL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy9tYWluL2phdmEvb3JnL29wZW5mbG93L3R5cGVzL1ZsYW5WaWQuamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvbWFpbi9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9WbGFuVmlkLmphdmEKQEAgLTgsNiArOCw5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnQgVkFMSURBVElPTl9NQVNLID0gMHgwRkZGOwogICAgIGZpbmFsIHN0YXRpYyBpbnQgTEVOR1RIID0gMjsKICAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZsYW5WaWQgTk9fTUFTSyA9IFZsYW5WaWQub2YoKHNob3J0KTB4RkZGRik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWbGFuVmlkIEZVTExfTUFTSyA9IFZsYW5WaWQub2YoKHNob3J0KTB4MCk7CisKICAgICBwcml2YXRlIGZpbmFsIHNob3J0IHZpZDsKICAgICAKICAgICBwcml2YXRlIFZsYW5WaWQoc2hvcnQgdmlkKSB7CkBAIC03MCw3ICs3Myw3IEBACiAgICAgICAgIGMud3JpdGVTaG9ydCh0aGlzLnZpZCk7CiAgICAgfQogCi0gICAgcHVibGljIFZsYW5WaWQgcmVhZDJCeXRlcyhDaGFubmVsQnVmZmVyIGMpIHRocm93cyBPRlBhcnNlRXJyb3IgeworICAgIHB1YmxpYyBzdGF0aWMgVmxhblZpZCByZWFkMkJ5dGVzKENoYW5uZWxCdWZmZXIgYykgdGhyb3dzIE9GUGFyc2VFcnJvciB7CiAgICAgICAgIHJldHVybiBWbGFuVmlkLm9mKGMucmVhZFNob3J0KCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSVB2NFRlc3QuamF2YSBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy90ZXN0L2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lQdjRUZXN0LmphdmEKaW5kZXggZDM0NDAyMS4uYTVhYzFiZSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSVB2NFRlc3QuamF2YQorKysgYi9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JUHY0VGVzdC5qYXZhCkBAIC0xMDgsMjkgKzEwOCwyMyBAQAogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9mUG9zc2libHlNYXNrZWQoKSB0aHJvd3MgT0ZQYXJzZUVycm9yLCBPRlNob3J0UmVhZCB7CisgICAgcHVibGljIHZvaWQgdGVzdE9mTWFza2VkKCkgdGhyb3dzIE9GUGFyc2VFcnJvciwgT0ZTaG9ydFJlYWQgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlwc1dpdGhNYXNrLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBPRlZhbHVlVHlwZSB2YWx1ZSA9IElQdjRXaXRoTWFzay5vZlBvc3NpYmx5TWFza2VkKGlwc1dpdGhNYXNrW2ldKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElQdjQgJiYgIWhhc01hc2tbaV0pIHsKLSAgICAgICAgICAgICAgICAvLyBUeXBlcyBPSywgY2hlY2sgdmFsdWVzCi0gICAgICAgICAgICAgICAgSVB2NCBpcCA9IChJUHY0KXZhbHVlOworICAgICAgICAgICAgSVB2NFdpdGhNYXNrIHZhbHVlID0gSVB2NFdpdGhNYXNrLm9mKGlwc1dpdGhNYXNrW2ldKTsKKyAgICAgICAgICAgIGlmICghaGFzTWFza1tpXSkgeworICAgICAgICAgICAgICAgIElQdjQgaXAgPSB2YWx1ZS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGlwc1dpdGhNYXNrVmFsdWVzW2ldWzBdLCBpcC5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXNrZWQgJiYgaGFzTWFza1tpXSkgewotICAgICAgICAgICAgICAgIE1hc2tlZDxJUHY0PiBpcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXAgPSAoTWFza2VkPElQdjQ+KXZhbHVlOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkludmFsaWQgTWFza2VkPFQ+IHR5cGUuIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGhhc01hc2tbaV0pIHsKKyAgICAgICAgICAgICAgICBieXRlW10gaXBCeXRlcyA9IG5ldyBieXRlWzRdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaXBzV2l0aE1hc2tWYWx1ZXNbaV1bMF0sIDAsIGlwQnl0ZXMsIDAsIDQpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpcEJ5dGVzLmxlbmd0aCwgdmFsdWUuZ2V0VmFsdWUoKS5nZXRCeXRlcygpLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpcEJ5dGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlwQnl0ZXNbal0gJj0gaXBzV2l0aE1hc2tWYWx1ZXNbaV1bMV1bal07CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFR5cGVzIE9LLCBjaGVjayB2YWx1ZXMKLSAgICAgICAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpcHNXaXRoTWFza1ZhbHVlc1tpXVswXSwgaXAuZ2V0VmFsdWUoKS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpcHNXaXRoTWFza1ZhbHVlc1tpXVsxXSwgaXAuZ2V0TWFzaygpLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElQdjQpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBtYXNrZWQgSVB2NCwgZ290IHVubWFza2VkIElQdjQuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHVubWFza2VkIElQdjQsIGdvdCBtYXNrZWQgSVB2NC4iKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpcEJ5dGVzLCB2YWx1ZS5nZXRWYWx1ZSgpLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGlwc1dpdGhNYXNrVmFsdWVzW2ldWzFdLCB2YWx1ZS5nZXRNYXNrKCkuZ2V0Qnl0ZXMoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JUHY2VGVzdC5qYXZhIGIvamF2YV9nZW4vcHJlLXdyaXR0ZW4vc3JjL3Rlc3QvamF2YS9vcmcvb3BlbmZsb3cvdHlwZXMvSVB2NlRlc3QuamF2YQppbmRleCBmMmY2ZmU4Li43MWFiMjhlIDEwMDY0NAotLS0gYS9qYXZhX2dlbi9wcmUtd3JpdHRlbi9zcmMvdGVzdC9qYXZhL29yZy9vcGVuZmxvdy90eXBlcy9JUHY2VGVzdC5qYXZhCisrKyBiL2phdmFfZ2VuL3ByZS13cml0dGVuL3NyYy90ZXN0L2phdmEvb3JnL29wZW5mbG93L3R5cGVzL0lQdjZUZXN0LmphdmEKQEAgLTU4LDMxICs1OCwyNSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1hc2tlZCgpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CiAgICAgICAgIGZvcihpbnQgaT0wOyBpIDwgaXBzV2l0aE1hc2subGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgICAgICBPRlZhbHVlVHlwZSB2YWx1ZSA9IElQdjZXaXRoTWFzay5vZlBvc3NpYmx5TWFza2VkKGlwc1dpdGhNYXNrW2ldKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElQdjYgJiYgIWhhc01hc2tbaV0pIHsKLSAgICAgICAgICAgICAgICAvLyBUeXBlcyBPSywgY2hlY2sgdmFsdWVzCi0gICAgICAgICAgICAgICAgSVB2NiBpcCA9IChJUHY2KXZhbHVlOworICAgICAgICAgICAgSVB2NldpdGhNYXNrIHZhbHVlID0gSVB2NldpdGhNYXNrLm9mKGlwc1dpdGhNYXNrW2ldKTsKKyAgICAgICAgICAgIGlmICghaGFzTWFza1tpXSkgeworICAgICAgICAgICAgICAgIElQdjYgaXAgPSB2YWx1ZS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGluZXRBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGlwc1dpdGhNYXNrW2ldKTsKIAogICAgICAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGlwLmdldEJ5dGVzKCksIGluZXRBZGRyZXNzLmdldEFkZHJlc3MoKSk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGlwc1dpdGhNYXNrW2ldLCBpcC50b1N0cmluZygpKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJUHY2V2l0aE1hc2sgJiYgaGFzTWFza1tpXSkgewotICAgICAgICAgICAgICAgIElQdjZXaXRoTWFzayBpcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXAgPSAoSVB2NldpdGhNYXNrKXZhbHVlOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkludmFsaWQgTWFza2VkPFQ+IHR5cGUuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFR5cGVzIE9LLCBjaGVjayB2YWx1ZXMKICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShpcHNXaXRoTWFza1tpXS5zdWJzdHJpbmcoMCwgaXBzV2l0aE1hc2tbaV0uaW5kZXhPZignLycpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpcC52YWx1ZS5nZXRCeXRlcygpLCBpbmV0QWRkcmVzcy5nZXRBZGRyZXNzKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpcHNXaXRoTWFza1tpXS5zdWJzdHJpbmcoMCwgaXBzV2l0aE1hc2tbaV0uaW5kZXhPZignLycpKSwgaXAudmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobWFza3NbaV0sIGlwLm1hc2suZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgSVB2NikgewotICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIG1hc2tlZCBJUHY2LCBnb3QgdW5tYXNrZWQgSVB2Ni4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgdW5tYXNrZWQgSVB2NiwgZ290IG1hc2tlZCBJUHY2LiIpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBhZGRyZXNzID0gaW5ldEFkZHJlc3MuZ2V0QWRkcmVzcygpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhhZGRyZXNzLmxlbmd0aCwgdmFsdWUuZ2V0VmFsdWUoKS5nZXRCeXRlcygpLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhZGRyZXNzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nbal0gJj0gbWFza3NbaV1bal07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHZhbHVlLmdldFZhbHVlKCkuZ2V0Qnl0ZXMoKSwgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobWFza3NbaV0sIHZhbHVlLmdldE1hc2soKS5nZXRCeXRlcygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYxVmVyMTAuQnVpbGRlci5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjFWZXIxMC5CdWlsZGVyLmphdmEKaW5kZXggNThhZmNkMC4uNjM0YzQ2ZSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjFWZXIxMC5CdWlsZGVyLmphdmEKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjFWZXIxMC5CdWlsZGVyLmphdmEKQEAgLTQ0LDI4ICs0NCwyOCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0RXhhY3QoCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoLkJ1aWxkZXIgc2V0RXhhY3QoCiAgICAgICAgICAgICBNYXRjaEZpZWxkPEY+IGZpZWxkLCBGIHZhbHVlKSB7CiAgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0TWFza2VkKAorICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaC5CdWlsZGVyIHNldE1hc2tlZCgKICAgICAgICAgICAgIE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUsIEYgbWFzaykgewogICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZCgKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2guQnVpbGRlciBzZXRNYXNrZWQoCiAgICAgICAgICAgICBNYXRjaEZpZWxkPEY+IGZpZWxkLCBNYXNrZWQ8Rj4gdmFsdWVXaXRoTWFzaykgewogICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHdpbGRjYXJkKE1hdGNoRmllbGQ8Rj4gZmllbGQpIHsKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2guQnVpbGRlciB3aWxkY2FyZChNYXRjaEZpZWxkPEY+IGZpZWxkKSB7CiAgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTc1LDMgKzc1LDEzIEBACiAgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlciBjcmVhdGVCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24gICAgICAgIAorICAgIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYyVmVyMTEuQnVpbGRlci5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjJWZXIxMS5CdWlsZGVyLmphdmEKaW5kZXggNThhZmNkMC4uNjM0YzQ2ZSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjJWZXIxMS5CdWlsZGVyLmphdmEKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjJWZXIxMS5CdWlsZGVyLmphdmEKQEAgLTQ0LDI4ICs0NCwyOCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0RXhhY3QoCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoLkJ1aWxkZXIgc2V0RXhhY3QoCiAgICAgICAgICAgICBNYXRjaEZpZWxkPEY+IGZpZWxkLCBGIHZhbHVlKSB7CiAgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0TWFza2VkKAorICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaC5CdWlsZGVyIHNldE1hc2tlZCgKICAgICAgICAgICAgIE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUsIEYgbWFzaykgewogICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZCgKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2guQnVpbGRlciBzZXRNYXNrZWQoCiAgICAgICAgICAgICBNYXRjaEZpZWxkPEY+IGZpZWxkLCBNYXNrZWQ8Rj4gdmFsdWVXaXRoTWFzaykgewogICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHdpbGRjYXJkKE1hdGNoRmllbGQ8Rj4gZmllbGQpIHsKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2guQnVpbGRlciB3aWxkY2FyZChNYXRjaEZpZWxkPEY+IGZpZWxkKSB7CiAgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTc1LDMgKzc1LDEzIEBACiAgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlciBjcmVhdGVCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24gICAgICAgIAorICAgIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYzVmVyMTIuQnVpbGRlci5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMi5CdWlsZGVyLmphdmEKaW5kZXggNThhZmNkMC4uNjM0YzQ2ZSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMi5CdWlsZGVyLmphdmEKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMi5CdWlsZGVyLmphdmEKQEAgLTQ0LDI4ICs0NCwyOCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0RXhhY3QoCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoLkJ1aWxkZXIgc2V0RXhhY3QoCiAgICAgICAgICAgICBNYXRjaEZpZWxkPEY+IGZpZWxkLCBGIHZhbHVlKSB7CiAgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0TWFza2VkKAorICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaC5CdWlsZGVyIHNldE1hc2tlZCgKICAgICAgICAgICAgIE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUsIEYgbWFzaykgewogICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZCgKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2guQnVpbGRlciBzZXRNYXNrZWQoCiAgICAgICAgICAgICBNYXRjaEZpZWxkPEY+IGZpZWxkLCBNYXNrZWQ8Rj4gdmFsdWVXaXRoTWFzaykgewogICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHdpbGRjYXJkKE1hdGNoRmllbGQ8Rj4gZmllbGQpIHsKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2guQnVpbGRlciB3aWxkY2FyZChNYXRjaEZpZWxkPEY+IGZpZWxkKSB7CiAgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTc1LDMgKzc1LDEzIEBACiAgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlciBjcmVhdGVCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24gICAgICAgIAorICAgIH0KZGlmZiAtLWdpdCBhL2phdmFfZ2VuL3RlbXBsYXRlcy9jdXN0b20vT0ZNYXRjaFYzVmVyMTMuQnVpbGRlci5qYXZhIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMy5CdWlsZGVyLmphdmEKaW5kZXggNThhZmNkMC4uMmMwMGE5MSAxMDA2NDQKLS0tIGEvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMy5CdWlsZGVyLmphdmEKKysrIGIvamF2YV9nZW4vdGVtcGxhdGVzL2N1c3RvbS9PRk1hdGNoVjNWZXIxMy5CdWlsZGVyLmphdmEKQEAgLTQ0LDI4ICs0NCwyOCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0RXhhY3QoCisgICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IE1hdGNoLkJ1aWxkZXIgc2V0RXhhY3QoCiAgICAgICAgICAgICBNYXRjaEZpZWxkPEY+IGZpZWxkLCBGIHZhbHVlKSB7CiAgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaEJ1aWxkZXIgc2V0TWFza2VkKAorICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXRjaC5CdWlsZGVyIHNldE1hc2tlZCgKICAgICAgICAgICAgIE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUsIEYgbWFzaykgewogICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHNldE1hc2tlZCgKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2guQnVpbGRlciBzZXRNYXNrZWQoCiAgICAgICAgICAgICBNYXRjaEZpZWxkPEY+IGZpZWxkLCBNYXNrZWQ8Rj4gdmFsdWVXaXRoTWFzaykgewogICAgICAgICAvLyBGSVhNRSB5b3RhbSAtIHBsZWFzZSByZXBsYWNlIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbgogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2hCdWlsZGVyIHdpbGRjYXJkKE1hdGNoRmllbGQ8Rj4gZmllbGQpIHsKKyAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWF0Y2guQnVpbGRlciB3aWxkY2FyZChNYXRjaEZpZWxkPEY+IGZpZWxkKSB7CiAgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTc1LDMgKzc1LDE0IEBACiAgICAgICAgIC8vIEZJWE1FIHlvdGFtIC0gcGxlYXNlIHJlcGxhY2Ugd2l0aCByZWFsIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlciBjcmVhdGVCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKENoYW5uZWxCdWZmZXIgYmIpIHsKKyAgICAgICAgLy8gRklYTUUgeW90YW0gLSBwbGVhc2UgcmVwbGFjZSB3aXRoIHJlYWwgaW1wbGVtZW50YXRpb24gICAgICAgIAorICAgIH0KKwpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ZhY3RvcnlfY2xhc3MuamF2YSBiL2phdmFfZ2VuL3RlbXBsYXRlcy9vZl9mYWN0b3J5X2NsYXNzLmphdmEKaW5kZXggODYyMDc4Ny4uZmVjMGJjZiAxMDA2NDQKLS0tIGEvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ZhY3RvcnlfY2xhc3MuamF2YQorKysgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfZmFjdG9yeV9jbGFzcy5qYXZhCkBAIC01Miw1ICs1Miw5IEBACiAvLzo6ICNlbmRpZgogLy86OiAjZW5kZm9yCiAKKyAgICBwdWJsaWMgT0ZNZXNzYWdlUmVhZGVyPE9GTWVzc2FnZT4gZ2V0TWVzc2FnZVJlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIE9GTWVzc2FnZVZlciR7ZmFjdG9yeS52ZXJzaW9uLm9mX3ZlcnNpb259LlJFQURFUjsKKyAgICB9CisKICAgICAvLzo6IGluY2x1ZGUoIl9zaW5nbGV0b24uamF2YSIsIG1zZz1mYWN0b3J5KQogfQpkaWZmIC0tZ2l0IGEvamF2YV9nZW4vdGVtcGxhdGVzL29mX2ZhY3RvcnlfaW50ZXJmYWNlLmphdmEgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfZmFjdG9yeV9pbnRlcmZhY2UuamF2YQppbmRleCA0Njc1MDRlLi4zOTQzMmE4IDEwMDY0NAotLS0gYS9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfZmFjdG9yeV9pbnRlcmZhY2UuamF2YQorKysgYi9qYXZhX2dlbi90ZW1wbGF0ZXMvb2ZfZmFjdG9yeV9pbnRlcmZhY2UuamF2YQpAQCAtNDIsNCArNDIsNiBAQAogICAgIC8vOjogI2VuZGlmCiAgICAgJHtpLm5hbWV9LkJ1aWxkZXIgY3JlYXRlJHtpLm5hbWVbMjpdfUJ1aWxkZXIoKSR7ICIiIGlmIGkuaXNfdW5pdmVyc2FsIGVsc2UgIiB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24ifTsKIC8vOjogI2VuZGZvcgorCisgICAgT0ZNZXNzYWdlUmVhZGVyPE9GTWVzc2FnZT4gZ2V0TWVzc2FnZVJlYWRlcigpOwogfQo=