ZGlmZiAtLWdpdCBhLy5iYXplbHJjIGIvLmJhemVscmMKaW5kZXggZTI0YmU4OC4uOGMzMjY2MSAxMDA2NDQKLS0tIGEvLmJhemVscmMKKysrIGIvLmJhemVscmMKQEAgLTMsOCArMywzMyBAQAogYnVpbGQgLS1leHBlcmltZW50YWxfc3RyaWN0X2FjdGlvbl9lbnYKIGJ1aWxkIC0tYWN0aW9uX2Vudj1QQVRICiBidWlsZCAtLWRpc2tfY2FjaGU9fi8uZ2Vycml0Y29kZXJldmlldy9iYXplbC1jYWNoZS9jYXMKLWJ1aWxkIC0tamF2YV90b29sY2hhaW4gLy90b29sczplcnJvcl9wcm9uZV93YXJuaW5nc190b29sY2hhaW4KKworIyBCdWlsZHMgdXNpbmcgcmVtb3RlX2pkazExLCBleGVjdXRlcyB1c2luZyByZW1vdGVfamRrMTEgb3IgbG9jYWxfamRrCitidWlsZCAtLWphdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xMQorYnVpbGQgLS1qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTEKK2J1aWxkIC0tdG9vbF9qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTEKK2J1aWxkIC0tdG9vbF9qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTEKKworIyBCdWlsZHMgYW5kIGV4ZWN1dGVzIG9uIFJCRSB1c2luZyByZW1vdGVqZGtfMTEKK2J1aWxkOnJlbW90ZSAtLWphdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xMQorYnVpbGQ6cmVtb3RlIC0tamF2YV9ydW50aW1lX3ZlcnNpb249cmVtb3RlamRrXzExCitidWlsZDpyZW1vdGUgLS10b29sX2phdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xMQorYnVpbGQ6cmVtb3RlIC0tdG9vbF9qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTEKKworIyBCdWlsZHMgdXNpbmcgcmVtb3RlX2pkazE3LCBleGVjdXRlcyB1c2luZyByZW1vdGVfamRrMTEgb3IgbG9jYWxfamRrCitidWlsZDpqYXZhMTcgLS1qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTcKK2J1aWxkOmphdmExNyAtLWphdmFfcnVudGltZV92ZXJzaW9uPXJlbW90ZWpka18xNworYnVpbGQ6amF2YTE3IC0tdG9vbF9qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTcKK2J1aWxkOmphdmExNyAtLXRvb2xfamF2YV9ydW50aW1lX3ZlcnNpb249cmVtb3RlamRrXzE3CisKKyMgQnVpbGRzIGFuZCBleGVjdXRlcyBvbiBSQkUgdXNpbmcgcmVtb3RlamRrXzE3CitidWlsZDpyZW1vdGUxNyAtLWphdmFfbGFuZ3VhZ2VfdmVyc2lvbj0xNworYnVpbGQ6cmVtb3RlMTcgLS1qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTcKK2J1aWxkOnJlbW90ZTE3IC0tdG9vbF9qYXZhX2xhbmd1YWdlX3ZlcnNpb249MTcKK2J1aWxkOnJlbW90ZTE3IC0tdG9vbF9qYXZhX3J1bnRpbWVfdmVyc2lvbj1yZW1vdGVqZGtfMTcKIAogdGVzdCAtLWJ1aWxkX3Rlc3RzX29ubHkKIHRlc3QgLS10ZXN0X291dHB1dD1lcnJvcnMKIAoraW1wb3J0ICV3b3Jrc3BhY2UlL3Rvb2xzL3JlbW90ZS1iYXplbHJjCisKZGlmZiAtLWdpdCBhLy5iYXplbHZlcnNpb24gYi8uYmF6ZWx2ZXJzaW9uCmluZGV4IGZjZGIyZTEuLjAwNjJhYzkgMTAwNjQ0Ci0tLSBhLy5iYXplbHZlcnNpb24KKysrIGIvLmJhemVsdmVyc2lvbgpAQCAtMSArMSBAQAotNC4wLjAKKzUuMC4wCmRpZmYgLS1naXQgYS8ubWFpbG1hcCBiLy5tYWlsbWFwCmluZGV4IGYwYmM5OTAuLmYwYWY0OWIgMTAwNjQ0Ci0tLSBhLy5tYWlsbWFwCisrKyBiLy5tYWlsbWFwCkBAIC0xMiw2ICsxMiw3IEBACiBTYcWhYSDFvWl2a292IDxzYXNhLnppdmtvdkBzYXAuY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhc2EgWml2a292IDxzYXNhLnppdmtvdkBzYXAuY29tPgogU2HFoWEgxb1pdmtvdiA8c2FzYS56aXZrb3ZAc2FwLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICBTYcWhYSDFvWl2a292IDx6aXZrb3ZAZ21haWwuY29tPgogU2HFoWEgxb1pdmtvdiA8c2FzYS56aXZrb3ZAc2FwLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICBTYXNhIFppdmtvdiA8eml2a292QGdtYWlsLmNvbT4KK1NlYmFzdGlhbiBTY2h1YmVydGggPHNzY2h1YmVydGhAZ21haWwuY29tPiAgICAgICAgICAgICAgICAgIFNlYmFzdGlhbiBTY2h1YmVydGggPHNlYmFzdGlhbi5zY2h1YmVydGhAYm9zY2guaW8+CiBTaGF3biBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+ICAgICAgICAgICAgICAgICAgICAgICAgICBTaGF3biBPLiBQZWFyY2UgPHNvcEBnb29nbGUuY29tPgogU2hhd24gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhd24gUGVhcmNlIDxzb3BAZ29vZ2xlLmNvbT4KIFNoYXduIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4KZGlmZiAtLWdpdCBhL0RFUEVOREVOQ0lFUyBiL0RFUEVOREVOQ0lFUwppbmRleCBlYmJlNDgwLi45M2ZhODUwIDEwMDY0NAotLS0gYS9ERVBFTkRFTkNJRVMKKysrIGIvREVQRU5ERU5DSUVTCkBAIC0xLDY5ICsxLDY4IEBACiBtYXZlbi9tYXZlbmNlbnRyYWwvYXJnczRqL2FyZ3M0ai8yLjMzLCBNSVQsIGFwcHJvdmVkLCBDUTExMDY4Ci1tYXZlbi9tYXZlbmNlbnRyYWwvY29tLmdvb2dsZS5jb2RlLmdzb24vZ3Nvbi8yLjguNywgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM0OTYKLW1hdmVuL21hdmVuY2VudHJhbC9jb20uZ29vZ2xlY29kZS5qYXZhZXdhaC9KYXZhRVdBSC8xLjEuMTIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTExNjU4CittYXZlbi9tYXZlbmNlbnRyYWwvY29tLmdvb2dsZS5jb2RlLmdzb24vZ3Nvbi8yLjguOSwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM0OTYKK21hdmVuL21hdmVuY2VudHJhbC9jb20uZ29vZ2xlY29kZS5qYXZhZXdhaC9KYXZhRVdBSC8xLjEuMTMsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTExNjU4CiBtYXZlbi9tYXZlbmNlbnRyYWwvY29tLmpjcmFmdC9qc2NoLzAuMS41NSwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgQ1ExOTQzNQogbWF2ZW4vbWF2ZW5jZW50cmFsL2NvbS5qY3JhZnQvanpsaWIvMS4xLjEsIEJTRC0yLUNsYXVzZSwgYXBwcm92ZWQsIENRNjIxOAogbWF2ZW4vbWF2ZW5jZW50cmFsL2NvbW1vbnMtY29kZWMvY29tbW9ucy1jb2RlYy8xLjExLCBBcGFjaGUtMi4wIEFORCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCBDUTE1OTcxCiBtYXZlbi9tYXZlbmNlbnRyYWwvY29tbW9ucy1sb2dnaW5nL2NvbW1vbnMtbG9nZ2luZy8xLjIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTEwMTYyCi1tYXZlbi9tYXZlbmNlbnRyYWwvamF2YXguc2VydmxldC9qYXZheC5zZXJ2bGV0LWFwaS8zLjEuMCwgQXBhY2hlLTIuMCBBTkQgKENEREwtMS4xIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMCksIGFwcHJvdmVkLCBDUTcyNDgKLW1hdmVuL21hdmVuY2VudHJhbC9qdW5pdC9qdW5pdC80LjEzLCAsIGFwcHJvdmVkLCBDUTIyNzk2Ci1tYXZlbi9tYXZlbmNlbnRyYWwvbG9nNGovbG9nNGovMS4yLjE1LCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1E3ODM3CittYXZlbi9tYXZlbmNlbnRyYWwvamF2YXguc2VydmxldC9qYXZheC5zZXJ2bGV0LWFwaS80LjAuMCwgLCBhcHByb3ZlZCwgQ1ExNjEyNQorbWF2ZW4vbWF2ZW5jZW50cmFsL2p1bml0L2p1bml0LzQuMTMuMiwgRVBMLTIuMCwgYXBwcm92ZWQsIENRMjM2MzYKIG1hdmVuL21hdmVuY2VudHJhbC9uZXQuYnl0ZWJ1ZGR5L2J5dGUtYnVkZHktYWdlbnQvMS45LjAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBjbGVhcmx5ZGVmaW5lZAogbWF2ZW4vbWF2ZW5jZW50cmFsL25ldC5ieXRlYnVkZHkvYnl0ZS1idWRkeS8xLjkuMCwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIGNsZWFybHlkZWZpbmVkCiBtYXZlbi9tYXZlbmNlbnRyYWwvbmV0LmkycC5jcnlwdG8vZWRkc2EvMC4zLjAsIENDMC0xLjAsIGFwcHJvdmVkLCBDUTIyNTM3CittYXZlbi9tYXZlbmNlbnRyYWwvbmV0LmphdmEuZGV2LmpuYS9qbmEtcGxhdGZvcm0vNS44LjAsIEFwYWNoZS0yLjAgT1IgTEdQTC0yLjEtb3ItbGF0ZXIsIGFwcHJvdmVkLCBDUTIzMjE4CittYXZlbi9tYXZlbmNlbnRyYWwvbmV0LmphdmEuZGV2LmpuYS9qbmEvNS44LjAsIEFwYWNoZS0yLjAgT1IgTEdQTC0yLjEtb3ItbGF0ZXIsIGFwcHJvdmVkLCBDUTIzMjE3CiBtYXZlbi9tYXZlbmNlbnRyYWwvbmV0LnNmLmpvcHQtc2ltcGxlL2pvcHQtc2ltcGxlLzQuNiwgTUlULCBhcHByb3ZlZCwgY2xlYXJseWRlZmluZWQKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLmFudC9hbnQtbGF1bmNoZXIvMS4xMC4xMCwgQXBhY2hlLTIuMCBBTkQgVzNDIEFORCBMaWNlbnNlUmVmLVB1YmxpYy1Eb21haW4sIGFwcHJvdmVkLCBDUTE1NTYwCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5hbnQvYW50LzEuMTAuMTAsIEFwYWNoZS0yLjAgQU5EIFczQyBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1ExNTU2MAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuY29tbW9ucy9jb21tb25zLWNvbXByZXNzLzEuMjAsIEFwYWNoZS0yLjAgQU5EIEJTRC0zLUNsYXVzZSBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1EyMTc3MQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuYW50L2FudC1sYXVuY2hlci8xLjEwLjEyLCBBcGFjaGUtMi4wIEFORCBXM0MgQU5EIExpY2Vuc2VSZWYtUHVibGljLURvbWFpbiwgYXBwcm92ZWQsIENRMTU1NjAKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLmFudC9hbnQvMS4xMC4xMiwgQXBhY2hlLTIuMCBBTkQgVzNDIEFORCBMaWNlbnNlUmVmLVB1YmxpYy1Eb21haW4sIGFwcHJvdmVkLCBDUTE1NTYwCittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5jb21tb25zL2NvbW1vbnMtY29tcHJlc3MvMS4yMSwgQXBhY2hlLTIuMCBBTkQgQlNELTMtQ2xhdXNlIEFORCBiemlwMi0xLjAuNiBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1EyMzcxMAogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuY29tbW9ucy9jb21tb25zLW1hdGgzLzMuMiwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIGNsZWFybHlkZWZpbmVkCiBtYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy9odHRwY2xpZW50LzQuNS4xMywgQXBhY2hlLTIuMCBBTkQgTGljZW5zZVJlZi1QdWJsaWMtRG9tYWluLCBhcHByb3ZlZCwgQ1EyMzUyNwogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMvaHR0cGNvcmUvNC40LjE0LCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1EyMzUyOAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuc3NoZC9zc2hkLWNvbW1vbi8yLjcuMCwgQXBhY2hlLTIuMCBhbmQgSVNDLCBhcHByb3ZlZCwgQ1EyMzQ2OQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuc3NoZC9zc2hkLWNvcmUvMi43LjAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTIzNDY5Ci1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5zc2hkL3NzaGQtb3NnaS8yLjcuMCwgQXBhY2hlLTIuMCBhbmQgSVNDLCBhcHByb3ZlZCwgQ1EyMzQ2OQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hcGFjaGUuc3NoZC9zc2hkLXNmdHAvMi43LjAsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTIzNDcwCittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmFwYWNoZS5zc2hkL3NzaGQtb3NnaS8yLjguMCwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM4OTIKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYXBhY2hlLnNzaGQvc3NoZC1zZnRwLzIuOC4wLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1EyMzg5MwogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5hc3NlcnRqL2Fzc2VydGotY29yZS8zLjIwLjIsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBjbGVhcmx5ZGVmaW5lZAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5ib3VuY3ljYXN0bGUvYmNwZy1qZGsxNW9uLzEuNjksIE1JVCBhbmQgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMjM0NzIKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcGtpeC1qZGsxNW9uLzEuNjksIE1JVCwgYXBwcm92ZWQsIENRMjM0NzMKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcHJvdi1qZGsxNW9uLzEuNjksIE1JVCwgYXBwcm92ZWQsIENRMjM0NzEKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjdXRpbC1qZGsxNW9uLzEuNjksIE1JVCwgYXBwcm92ZWQsIENRMjM0NzQKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1odHRwLzkuNC40My52MjAyMTA2MjksICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1pby85LjQuNDMudjIwMjEwNjI5LCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktc2VjdXJpdHkvOS40LjQzLnYyMDIxMDYyOSwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXNlcnZlci85LjQuNDMudjIwMjEwNjI5LCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktc2VydmxldC85LjQuNDMudjIwMjEwNjI5LCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktdXRpbC1hamF4LzkuNC40My52MjAyMTA2MjksICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS11dGlsLzkuNC40My52MjAyMTA2MjksICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LmFudC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0LzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQucGdtLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC50ZXN0LzUuMTMuMC1TTkFQU0hPVCwgLCBhcHByb3ZlZCwgZWNsaXBzZQotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC51aS81LjEzLjAtU05BUFNIT1QsICwgYXBwcm92ZWQsIGVjbGlwc2UKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQvNS4xMy4wLVNOQVBTSE9ULCAsIGFwcHJvdmVkLCBlY2xpcHNlCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmhhbWNyZXN0L2hhbWNyZXN0LWNvcmUvMS4zLCBCU0QtMi1DbGF1c2UsIGFwcHJvdmVkLCBDUTcwNjMKLW1hdmVuL21hdmVuY2VudHJhbC9vcmcuaGFtY3Jlc3QvaGFtY3Jlc3QvMi4yLCBCU0QtMi1DbGF1c2UsIGFwcHJvdmVkLCBjbGVhcmx5ZGVmaW5lZAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5tb2NraXRvL21vY2tpdG8tY29yZS8yLjIzLjAsIE1JVCwgYXBwcm92ZWQsIENRMTc5NzYKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcGctamRrMTVvbi8xLjcwLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgIzE3MTMKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuYm91bmN5Y2FzdGxlL2JjcGtpeC1qZGsxNW9uLzEuNzAsIE1JVCwgYXBwcm92ZWQsIGNsZWFybHlkZWZpbmVkCittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmJvdW5jeWNhc3RsZS9iY3Byb3YtamRrMTVvbi8xLjcwLCBNSVQsIGFwcHJvdmVkLCAjMTcxMgorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5ib3VuY3ljYXN0bGUvYmN1dGlsLWpkazE1b24vMS43MCwgTUlULCBhcHByb3ZlZCwgY2xlYXJseWRlZmluZWQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS50b29sY2hhaW4vamV0dHktc2VydmxldC1hcGkvNC4wLjYsIEVQTC0yLjAgT1IgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIHJ0LmpldHR5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktaHR0cC8xMC4wLjYsIEVQTC0yLjAgT1IgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIHJ0LmpldHR5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamV0dHkvamV0dHktaW8vMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXNlY3VyaXR5LzEwLjAuNiwgRVBMLTIuMCBPUiBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgcnQuamV0dHkKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZXR0eS9qZXR0eS1zZXJ2ZXIvMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXNlcnZsZXQvMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpldHR5L2pldHR5LXV0aWwvMTAuMC42LCBFUEwtMi4wIE9SIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBydC5qZXR0eQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LmFudC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQubGZzLzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5wZ20vNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5lY2xpcHNlLmpnaXQvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0LzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQudGVzdC82LjEuMC1TTkFQU0hPVCwgQlNELTMtQ2xhdXNlLCBhcHByb3ZlZCwgdGVjaG5vbG9neS5qZ2l0CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLmVjbGlwc2UuamdpdC9vcmcuZWNsaXBzZS5qZ2l0LnVpLzYuMS4wLVNOQVBTSE9ULCBCU0QtMy1DbGF1c2UsIGFwcHJvdmVkLCB0ZWNobm9sb2d5LmpnaXQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuZWNsaXBzZS5qZ2l0L29yZy5lY2xpcHNlLmpnaXQvNi4xLjAtU05BUFNIT1QsIEJTRC0zLUNsYXVzZSwgYXBwcm92ZWQsIHRlY2hub2xvZ3kuamdpdAorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5oYW1jcmVzdC9oYW1jcmVzdC1jb3JlLzEuMywgQlNELTItQ2xhdXNlLCBhcHByb3ZlZCwgQ1ExMTQyOQorbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5tb2NraXRvL21vY2tpdG8tY29yZS8yLjIzLjAsIEFwYWNoZS0yLjAgQU5EIE1JVCwgYXBwcm92ZWQsICM5NTgKIG1hdmVuL21hdmVuY2VudHJhbC9vcmcub2JqZW5lc2lzL29iamVuZXNpcy8yLjYsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTE1NDc4Ci1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLm9wZW5qZGsuam1oL2ptaC1jb3JlLzEuMzIsIEdQTC0yLjAsIGFwcHJvdmVkLCBDUTIzNDk5Ci1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLm9wZW5qZGsuam1oL2ptaC1nZW5lcmF0b3ItYW5ucHJvY2Vzcy8xLjMyLCBHUEwtMi4wLCBhcHByb3ZlZCwgQ1EyMzUwMAotbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5vc2dpL29yZy5vc2dpLmNvcmUvNC4zLjEsIEFwYWNoZS0yLjAsIGFwcHJvdmVkLCBDUTEwMTExCi1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLnNsZjRqL2pjbC1vdmVyLXNsZjRqLzEuNy4zMCwgQXBhY2hlLTIuMCwgYXBwcm92ZWQsIENRMTI4NDMKK21hdmVuL21hdmVuY2VudHJhbC9vcmcub3Blbmpkay5qbWgvam1oLWNvcmUvMS4zMiwgR1BMLTIuMC1vbmx5IHdpdGggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAsIGFwcHJvdmVkLCAjOTU5CittYXZlbi9tYXZlbmNlbnRyYWwvb3JnLm9wZW5qZGsuam1oL2ptaC1nZW5lcmF0b3ItYW5ucHJvY2Vzcy8xLjMyLCBHUEwtMi4wLW9ubHkgd2l0aCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMCwgYXBwcm92ZWQsICM5NjIKK21hdmVuL21hdmVuY2VudHJhbC9vcmcub3NnaS9vcmcub3NnaS5jb3JlLzYuMC4wLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgIzE3OTQKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuc2xmNGovamNsLW92ZXItc2xmNGovMS43LjMyLCBBcGFjaGUtMi4wLCBhcHByb3ZlZCwgQ1ExMjg0MwogbWF2ZW4vbWF2ZW5jZW50cmFsL29yZy5zbGY0ai9zbGY0ai1hcGkvMS43LjMwLCBNSVQsIGFwcHJvdmVkLCBDUTEzMzY4Ci1tYXZlbi9tYXZlbmNlbnRyYWwvb3JnLnNsZjRqL3NsZjRqLWxvZzRqMTIvMS43LjMwLCBNSVQsIGFwcHJvdmVkLCBDUTc2NjUKK21hdmVuL21hdmVuY2VudHJhbC9vcmcuc2xmNGovc2xmNGotc2ltcGxlLzEuNy4zMCwgTUlULCBhcHByb3ZlZCwgQ1E3OTUyCiBtYXZlbi9tYXZlbmNlbnRyYWwvb3JnLnR1a2FhbmkveHovMS45LCBMaWNlbnNlUmVmLVB1YmxpYy1Eb21haW4sIGFwcHJvdmVkLCBDUTIzNDk4CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1vcHRpb25zLm1kIGIvRG9jdW1lbnRhdGlvbi9jb25maWctb3B0aW9ucy5tZAppbmRleCA3MjIxY2NlLi44MTU2NzdjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1vcHRpb25zLm1kCisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLW9wdGlvbnMubWQKQEAgLTQ2LDcgKzQ2LDggQEAKIHwgYGNvcmUuc3RyZWFtRmlsZVRocmVzaG9sZGAgfCBgNTAgTWlCYCB8ICYjeDIwREU7IHwgVGhlIHNpemUgdGhyZXNob2xkIGJleW9uZCB3aGljaCBvYmplY3RzIG11c3QgYmUgc3RyZWFtZWQuIHwKIHwgYGNvcmUuc3VwcG9ydHNBdG9taWNGaWxlQ3JlYXRpb25gIHwgYHRydWVgIHwgJiN4MjBERTsgfCBXaGV0aGVyIHRoZSBmaWxlc3lzdGVtIHN1cHBvcnRzIGF0b21pYyBmaWxlIGNyZWF0aW9uLiB8CiB8IGBjb3JlLnN5bWxpbmtzYCB8IEF1dG8gZGV0ZWN0IGlmIGZpbGVzeXN0ZW0gc3VwcG9ydHMgc3ltbGlua3N8ICYjeDI3MDU7IHwgSWYgZmFsc2UsIHN5bWJvbGljIGxpbmtzIGFyZSBjaGVja2VkIG91dCBhcyBzbWFsbCBwbGFpbiBmaWxlcyB0aGF0IGNvbnRhaW4gdGhlIGxpbmsgdGV4dC4gfAotfCBgY29yZS50cnVzdEZvbGRlclN0YXRgIHwgYHRydWVgIHwgJiN4MjBERTsgfCBXaGV0aGVyIHRvIHRydXN0IHRoZSBwYWNrIGZvbGRlcidzIG1vZGlmaWNhdGlvbiB0aW1lLiBJZiBgZmFsc2VgIEpHaXQgd2lsbCBhbHdheXMgc2NhbiB0aGUgYC5naXQvb2JqZWN0cy9wYWNrYCBmb2xkZXIgdG8gY2hlY2sgZm9yIG5ldyBwYWNrIGZpbGVzLiBUaGlzIGNhbiBoZWxwIHRvIHdvcmthcm91bmQgY2FjaGluZyBpc3N1ZXMgb24gTkZTLCBidXQgcmVkdWNlcyBwZXJmb3JtYW5jZS4gSWYgc2V0IHRvIGB0cnVlYCBpdCB1c2VzIHRoZSBgbGFzdG1vZGlmaWVkYCBhdHRyaWJ1dGUgb2YgdGhlIGZvbGRlciBhbmQgYXNzdW1lcyB0aGF0IG5vIG5ldyBwYWNrIGZpbGVzIGNhbiBiZSBpbiB0aGlzIGZvbGRlciBpZiBpdHMgbW9kaWZpY2F0aW9uIHRpbWUgaGFzIG5vdCBjaGFuZ2VkLiB8Cit8IGBjb3JlLnRydXN0Rm9sZGVyU3RhdGAgfCBgdHJ1ZWAgfCAmI3gyMERFOyB8IFdoZXRoZXIgdG8gdHJ1c3QgdGhlIHBhY2sgZm9sZGVyJ3MsIHBhY2tlZC1yZWZzIGZpbGUncyBhbmQgbG9vc2Utb2JqZWN0cyBmb2xkZXIncyBmaWxlIGF0dHJpYnV0ZXMgKEphdmEgZXF1aXZhbGVudCBvZiBzdGF0IGNvbW1hbmQgb24gKm5peCkuIFdoZW4gbG9va2luZyBmb3IgcGFjayBmaWxlcywgaWYgYGZhbHNlYCBKR2l0IHdpbGwgYWx3YXlzIHNjYW4gdGhlIGAuZ2l0L29iamVjdHMvcGFja2AgZm9sZGVyIGFuZCBpZiBzZXQgdG8gYHRydWVgIGl0IGFzc3VtZXMgdGhhdCBwYWNrIGZpbGVzIGFyZSB1bmNoYW5nZWQgaWYgdGhlIGZpbGUgYXR0cmlidXRlcyBvZiB0aGUgcGFjayBmb2xkZXIgYXJlIHVuY2hhbmdlZC4gV2hlbiBnZXR0aW5nIHRoZSBsaXN0IG9mIHBhY2tlZCByZWZzLCBpZiBgZmFsc2VgIEpHaXQgd2lsbCBhbHdheXMgcmVhZCB0aGUgcGFja2VkLXJlZnMgZmlsZSBhbmQgaWYgc2V0IHRvIGB0cnVlYCBpdCB1c2VzIHRoZSBmaWxlIGF0dHJpYnV0ZXMgb2YgdGhlIHBhY2tlZC1yZWZzIGZpbGUgYW5kIHdpbGwgb25seSByZWFkIGl0IGlmIGEgZmlsZSBhdHRyaWJ1dGUgaGFzIGNoYW5nZWQuIFdoZW4gbG9va2luZyBmb3IgbG9vc2Ugb2JqZWN0cywgaWYgYGZhbHNlYCBhbmQgaWYgYSBsb29zZSBvYmplY3QgaXMgbm90IGZvdW5kLCBKR2l0IHdpbGwgb3BlbiBhbmQgY2xvc2UgYSBzdHJlYW0gdG8gYC5naXQvb2JqZWN0c2AgZm9sZGVyICh3aGljaCBjYW4gcmVmcmVzaCBpdHMgZGlyZWN0b3J5IGxpc3RpbmcsIGF0IGxlYXN0IG9uIHNvbWUgTkZTIGNsaWVudHMpIGFuZCByZXRyeSBsb29raW5nIGZvciB0aGF0IGxvb3NlIG9iamVjdC4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBgZmFsc2VgIGNhbiBoZWxwIHRvIHdvcmthcm91bmQgY2FjaGluZyBpc3N1ZXMgb24gTkZTLCBidXQgcmVkdWNlcyBwZXJmb3JtYW5jZS4gfAorfCBgY29yZS50cnVzdFBhY2tlZFJlZnNTdGF0YCB8IGB1bnNldGAgfCAmI3gyMERFOyB8IFdoZXRoZXIgdG8gdHJ1c3QgdGhlIGZpbGUgYXR0cmlidXRlcyAoSmF2YSBlcXVpdmFsZW50IG9mIHN0YXQgY29tbWFuZCBvbiAqbml4KSBvZiB0aGUgcGFja2VkLXJlZnMgZmlsZS4gSWYgYG5ldmVyYCBKR2l0IHdpbGwgaWdub3JlIHRoZSBmaWxlIGF0dHJpYnV0ZXMgb2YgdGhlIHBhY2tlZC1yZWZzIGZpbGUgYW5kIGFsd2F5cyByZWFkIGl0LiBJZiBgYWx3YXlzYCBKR2l0IHdpbGwgdHJ1c3QgdGhlIGZpbGUgYXR0cmlidXRlcyBvZiB0aGUgcGFja2VkLXJlZnMgZmlsZSBhbmQgd2lsbCBvbmx5IHJlYWQgaXQgaWYgYSBmaWxlIGF0dHJpYnV0ZSBoYXMgY2hhbmdlZC4gYGFmdGVyX29wZW5gIGJlaGF2ZXMgdGhlIHNhbWUgYXMgYGFsd2F5c2AsIGV4Y2VwdCB0aGF0IHRoZSBwYWNrZWQtcmVmcyBmaWxlIGlzIG9wZW5lZCBhbmQgY2xvc2VkIGJlZm9yZSBpdHMgZmlsZSBhdHRyaWJ1dGVzIGFyZSBjb25zaWRlcmVkLiBBbiBvcGVuL2Nsb3NlIG9mIHRoZSBwYWNrZWQtcmVmcyBmaWxlIGlzIGtub3duIHRvIHJlZnJlc2ggaXRzIGZpbGUgYXR0cmlidXRlcywgYXQgbGVhc3Qgb24gc29tZSBORlMgY2xpZW50cy4gSWYgYHVuc2V0YCwgSkdpdCB3aWxsIHVzZSB0aGUgYmVoYXZpb3IgZGVzY3JpYmVkIGluIGB0cnVzdEZvbGRlclN0YXRgLiB8CiB8IGBjb3JlLndvcmt0cmVlYCB8IFJvb3QgZGlyZWN0b3J5IG9mIHRoZSB3b3JraW5nIHRyZWUgaWYgaXQgaXMgbm90IHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBgLmdpdGAgZGlyZWN0b3J5IHwgJiN4MjcwNTsgfCBUaGUgcGF0aCB0byB0aGUgcm9vdCBvZiB0aGUgd29ya2luZyB0cmVlLiB8CiAKICMjIF9fZ2NfXyBvcHRpb25zCmRpZmYgLS1naXQgYS9XT1JLU1BBQ0UgYi9XT1JLU1BBQ0UKaW5kZXggNTFhODE1ZS4uMDQwNjE3ZSAxMDA2NDQKLS0tIGEvV09SS1NQQUNFCisrKyBiL1dPUktTUEFDRQpAQCAtMSwyMyArMSw2IEBACiB3b3Jrc3BhY2UobmFtZSA9ICJqZ2l0IikKIAogbG9hZCgiQGJhemVsX3Rvb2xzLy90b29scy9idWlsZF9kZWZzL3JlcG86aHR0cC5iemwiLCAiaHR0cF9hcmNoaXZlIikKLQotaHR0cF9hcmNoaXZlKAotICAgIG5hbWUgPSAiYmF6ZWxfc2t5bGliIiwKLSAgICBzaGEyNTYgPSAiMmVhOGE1ZWQyYjQ0OGJhZjRhNjg1NWQzY2UwNDljNGM0NTJhNjQ3MGIxZWZkMTUwNGZkYjdjMWMxMzRkMjIwYSIsCi0gICAgc3RyaXBfcHJlZml4ID0gImJhemVsLXNreWxpYi0wLjguMCIsCi0gICAgdXJscyA9IFsiaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwtc2t5bGliL2FyY2hpdmUvMC44LjAudGFyLmd6Il0sCi0pCi0KLSMgQ2hlY2sgQmF6ZWwgdmVyc2lvbiB3aGVuIGludm9rZWQgYnkgQmF6ZWwgZGlyZWN0bHkKLWxvYWQoIi8vdG9vbHM6YmF6ZWxpc2tfdmVyc2lvbi5iemwiLCAiYmF6ZWxpc2tfdmVyc2lvbiIpCi0KLWJhemVsaXNrX3ZlcnNpb24obmFtZSA9ICJiYXplbGlza192ZXJzaW9uIikKLQotbG9hZCgiQGJhemVsaXNrX3ZlcnNpb24vLzpjaGVjay5iemwiLCAiY2hlY2tfYmF6ZWxfdmVyc2lvbiIpCi0KLWNoZWNrX2JhemVsX3ZlcnNpb24oKQotCiBsb2FkKCIvL3Rvb2xzOmJhemxldHMuYnpsIiwgImxvYWRfYmF6bGV0cyIpCiAKIGxvYWRfYmF6bGV0cyhjb21taXQgPSAiZjMwYTk5MmRhOWZjODU1ZGNlODE5ODc1YWZiNTlmOWRkNmY4NjBjZCIpCkBAIC0yOCwzMiArMTEsMTggQEAKICkKIAogaHR0cF9hcmNoaXZlKAotICAgIG5hbWUgPSAib3BlbmpkazE1X2xpbnV4X2FyY2hpdmUiLAotICAgIGJ1aWxkX2ZpbGVfY29udGVudCA9ICIiIgotamF2YV9ydW50aW1lKG5hbWUgPSAncnVudGltZScsIHNyY3MgPSAgZ2xvYihbJyoqJ10pLCB2aXNpYmlsaXR5ID0gWycvL3Zpc2liaWxpdHk6cHVibGljJ10pCi1leHBvcnRzX2ZpbGVzKFsiV09SS1NQQUNFIl0sIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSkKLSIiIiwKLSAgICBzaGEyNTYgPSAiMGEzOGYxMTM4YzE1YTRmMjQzYjc1ZWI4MmY4ZWY0MDg1NWFmY2M0MDJlM2MyYTZkZTk3Y2U4MjM1MDExYjFhZCIsCi0gICAgc3RyaXBfcHJlZml4ID0gInp1bHUxNS4yNy4xNy1jYS1qZGsxNS4wLjAtbGludXhfeDY0IiwKKyAgICBuYW1lID0gInJiZV9qZGsxMSIsCisgICAgc2hhMjU2ID0gIjc2Njc5NmRlNzE5MTYxMThlNTI4YjlmNDMzNGMyOWM5YzliNGU5MjYyMjdiZjMyNjRkZWU1NTVlNmE0MzA2YzgiLAorICAgIHN0cmlwX3ByZWZpeCA9ICJyYmVfYXV0b2NvbmZpZy0yLjAuMCIsCiAgICAgdXJscyA9IFsKLSAgICAgICAgImh0dHBzOi8vbWlycm9yLmJhemVsLmJ1aWxkL2Nkbi5henVsLmNvbS96dWx1L2Jpbi96dWx1MTUuMjcuMTctY2EtamRrMTUuMC4wLWxpbnV4X3g2NC50YXIuZ3oiLAotICAgICAgICAiaHR0cHM6Ly9jZG4uYXp1bC5jb20venVsdS9iaW4venVsdTE1LjI3LjE3LWNhLWpkazE1LjAuMC1saW51eF94NjQudGFyLmd6IiwKKyAgICAgICAgImh0dHBzOi8vZ2Vycml0LWJhemVsLnN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcmJlX2F1dG9jb25maWcvdjIuMC4wLnRhci5neiIsCisgICAgICAgICJodHRwczovL2dpdGh1Yi5jb20vZGF2aWRvL3JiZV9hdXRvY29uZmlnL2FyY2hpdmUvdjIuMC4wLnRhci5neiIsCiAgICAgXSwKICkKIAotaHR0cF9hcmNoaXZlKAotICAgIG5hbWUgPSAib3BlbmpkazE1X2Rhcndpbl9hcmNoaXZlIiwKLSAgICBidWlsZF9maWxlX2NvbnRlbnQgPSAiIiIKLWphdmFfcnVudGltZShuYW1lID0gJ3J1bnRpbWUnLCBzcmNzID0gIGdsb2IoWycqKiddKSwgdmlzaWJpbGl0eSA9IFsnLy92aXNpYmlsaXR5OnB1YmxpYyddKQotZXhwb3J0c19maWxlcyhbIldPUktTUEFDRSJdLCB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCi0iIiIsCi0gICAgc2hhMjU2ID0gImY4MGIyZTA1MTJkOWQ4YTkyYmUyNDQ5NzMzNGM5NzRiZmVjYzhjODk4ZmMyMTVjZTBlNzY1OTRmMDA0Mzc0ODIiLAotICAgIHN0cmlwX3ByZWZpeCA9ICJ6dWx1MTUuMjcuMTctY2EtamRrMTUuMC4wLW1hY29zeF94NjQiLAotICAgIHVybHMgPSBbCi0gICAgICAgICJodHRwczovL21pcnJvci5iYXplbC5idWlsZC9jZG4uYXp1bC5jb20venVsdS9iaW4venVsdTE1LjI3LjE3LWNhLWpkazE1LjAuMC1tYWNvc3hfeDY0LnRhci5neiIsCi0gICAgICAgICJodHRwczovL2Nkbi5henVsLmNvbS96dWx1L2Jpbi96dWx1MTUuMjcuMTctY2EtamRrMTUuMC4wLW1hY29zeF94NjQudGFyLmd6IiwKLSAgICBdLAotKQorcmVnaXN0ZXJfdG9vbGNoYWlucygiLy90b29sczplcnJvcl9wcm9uZV93YXJuaW5nc190b29sY2hhaW5famF2YTExX2RlZmluaXRpb24iKQorCityZWdpc3Rlcl90b29sY2hhaW5zKCIvL3Rvb2xzOmVycm9yX3Byb25lX3dhcm5pbmdzX3Rvb2xjaGFpbl9qYXZhMTdfZGVmaW5pdGlvbiIpCiAKIEpNSF9WRVJTID0gIjEuMzIiCiAKQEAgLTEyMywxNCArOTIsMTQgQEAKIAogbWF2ZW5famFyKAogICAgIG5hbWUgPSAic3NoZC1vc2dpIiwKLSAgICBhcnRpZmFjdCA9ICJvcmcuYXBhY2hlLnNzaGQ6c3NoZC1vc2dpOjIuNy4wIiwKLSAgICBzaGExID0gImExMDFhYWQwZjc5YWQ0MjQ0OTgwOThmN2U5MWMzOWQzZDkyMTc3YzEiLAorICAgIGFydGlmYWN0ID0gIm9yZy5hcGFjaGUuc3NoZDpzc2hkLW9zZ2k6Mi44LjAiLAorICAgIHNoYTEgPSAiYjJhNTliNzNjMDQ1ZjQwZDU3MjJiOTE2MGQ0ZjkwOWE2NDZkODZjOSIsCiApCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gInNzaGQtc2Z0cCIsCi0gICAgYXJ0aWZhY3QgPSAib3JnLmFwYWNoZS5zc2hkOnNzaGQtc2Z0cDoyLjcuMCIsCi0gICAgc2hhMSA9ICIwYzllZmY3MTQ1ZTIwYjMzOGMxZGQ2YWNhMzZiYTkzZWQ3YzAxNDdjIiwKKyAgICBhcnRpZmFjdCA9ICJvcmcuYXBhY2hlLnNzaGQ6c3NoZC1zZnRwOjIuOC4wIiwKKyAgICBzaGExID0gImQzY2Q5YmM4ZDMzNWIzZWQxYTg2ZDI5NjVkZWI0ZDIwMmRlMjc0NDIiLAogKQogCiBtYXZlbl9qYXIoCkBAIC0yMzksOCArMjA4LDggQEAKIAogbWF2ZW5famFyKAogICAgIG5hbWUgPSAiZ3NvbiIsCi0gICAgYXJ0aWZhY3QgPSAiY29tLmdvb2dsZS5jb2RlLmdzb246Z3NvbjoyLjguOCIsCi0gICAgc2hhMSA9ICI0MzFmYzNjYmMwZmY4MWFiZGJmZGUwNzAwNjI3NDEwODljM2JhODc0IiwKKyAgICBhcnRpZmFjdCA9ICJjb20uZ29vZ2xlLmNvZGUuZ3Nvbjpnc29uOjIuOC45IiwKKyAgICBzaGExID0gIjhhNDMyYzFkNjgyNTc4MWUyMWEwMmRiMmUyYzMzYzVmZGUyODMzYjkiLAogKQogCiBKRVRUWV9WRVIgPSAiMTAuMC42IgpAQCAtMjk0LDMyICsyNjMsMzIgQEAKICAgICBzcmNfc2hhMSA9ICJmMzVmNTUyNWE1ZDMwZGMxMjM3Yjg1NDU3ZDc1OGQ1NzhlM2NlOGQwIiwKICkKIAotQk9VTkNZQ0FTVExFX1ZFUiA9ICIxLjY5IgorQk9VTkNZQ0FTVExFX1ZFUiA9ICIxLjcwIgogCiBtYXZlbl9qYXIoCiAgICAgbmFtZSA9ICJiY3BnIiwKICAgICBhcnRpZmFjdCA9ICJvcmcuYm91bmN5Y2FzdGxlOmJjcGctamRrMTVvbjoiICsgQk9VTkNZQ0FTVExFX1ZFUiwKLSAgICBzaGExID0gImQ5OWEwOGMzZjY1MWIyNmU4ZWI2NjhlOTQxYjBiYmQyYzA5ZWNlMDgiLAotICAgIHNyY19zaGExID0gImRlMWZjMjYxYjQ0YThlYjYwNTgzNDEzYTMxZmZjOThjZTNkY2UzOGIiLAorICAgIHNoYTEgPSAiMDYyZjcyZWMwNmYzMWE2YzMxYTNmMzM1NWZjZTAzODRiMjExMjZkNyIsCisgICAgc3JjX3NoYTEgPSAiOWRlZTczYWQ5MjY3NTJlZTNiNDIxYTdkYzQ1MzEyODcxNjZjY2YzNiIsCiApCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gImJjcHJvdiIsCiAgICAgYXJ0aWZhY3QgPSAib3JnLmJvdW5jeWNhc3RsZTpiY3Byb3YtamRrMTVvbjoiICsgQk9VTkNZQ0FTVExFX1ZFUiwKLSAgICBzaGExID0gIjkxZTE2MjgyNTFjZjNjYTkwMDkzY2U5ZDBmZTY3ZTViN2RhYjM4NTAiLAotICAgIHNyY19zaGExID0gIjY3ZGM2NDc2ODQ1ZjZiMjljYjUyMGI1ZGY2MWRiNjVhZTU2NzE4ZTQiLAorICAgIHNoYTEgPSAiNDYzNmEwZDAxZjc0YWNhZjI4MDgyZmI2MmIzMTdmMTA4MDExODM3MSIsCisgICAgc3JjX3NoYTEgPSAiNjI0NWUxNWRkNDdlNWZjMzNjZmYyNzVkZjYxNjYyZTBhOGU1OTU4ZiIsCiApCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gImJjdXRpbCIsCiAgICAgYXJ0aWZhY3QgPSAib3JnLmJvdW5jeWNhc3RsZTpiY3V0aWwtamRrMTVvbjoiICsgQk9VTkNZQ0FTVExFX1ZFUiwKLSAgICBzaGExID0gImMzZWRmOTNkMzQ2ZTk3ZjY0ZjA0MWU0NDhlNzQ1NWMzOWM3ZWZmNjQiLAotICAgIHNyY19zaGExID0gImRlZWIzZmJiZjM3M2UwNWUyYTIwOTQxZjlhOGNlOTBlOWFlYWIzZDIiLAorICAgIHNoYTEgPSAiNTQyODBlNzE5NWE3NDMwZDc5MTFkZWQ5M2ZjMDFlMDczMDBiOTUyNiIsCisgICAgc3JjX3NoYTEgPSAiNGFmNGE2YzkyYjhlYTA3ODg1YjI3ZDg1MzZiODFiODU1NDk3ZjRlYiIsCiApCiAKIG1hdmVuX2phcigKICAgICBuYW1lID0gImJjcGtpeCIsCiAgICAgYXJ0aWZhY3QgPSAib3JnLmJvdW5jeWNhc3RsZTpiY3BraXgtamRrMTVvbjoiICsgQk9VTkNZQ0FTVExFX1ZFUiwKLSAgICBzaGExID0gIjQ1YzM2ZmI3MmZhZmIwYjY4OGM2YWY3OTVlNmNjODAzZjZmNzllZTUiLAotICAgIHNyY19zaGExID0gIjhiYzUyMTQ0MDE0NTliZDkxZWVhODE2YjUxNjA3OWRhMzgzNzRlOTAiLAorICAgIHNoYTEgPSAiZjgxZTVhZjQ5NTcxYTlkNWExMDlhODhmMjM5YTczY2U4NzA1NTQxNyIsCisgICAgc3JjX3NoYTEgPSAiNDJmOWRlNTNhOTFiMjBiYzA2ZTg4NDgyYzU3ZmQ5N2U1YTg0MjUwZCIsCiApCmRpZmYgLS1naXQgYS9saWIvQlVJTEQgYi9saWIvQlVJTEQKaW5kZXggOTQ0MjdmNi4uNmJlOWU1NyAxMDA2NDQKLS0tIGEvbGliL0JVSUxECisrKyBiL2xpYi9CVUlMRApAQCAtOTcsNyArOTcsNyBAQAogamF2YV9saWJyYXJ5KAogICAgIG5hbWUgPSAiam5hIiwKICAgICB2aXNpYmlsaXR5ID0gWwotICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50Ol9fcGtnX18iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQ6X19wa2dfXyIsCiAgICAgXSwKICAgICBleHBvcnRzID0gWyJAam5hLy9qYXIiXSwKICkKQEAgLTEwNSw3ICsxMDUsNyBAQAogamF2YV9saWJyYXJ5KAogICAgIG5hbWUgPSAiam5hLXBsYXRmb3JtIiwKICAgICB2aXNpYmlsaXR5ID0gWwotICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50Ol9fcGtnX18iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQ6X19wa2dfXyIsCiAgICAgXSwKICAgICBleHBvcnRzID0gWyJAam5hLXBsYXRmb3JtLy9qYXIiXSwKICkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDk0MzM2NTguLjA5OTc1NzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNSwxMyArNSwxMyBAQAogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0CiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKIEltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudCwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sCmluZGV4IDZhZDY0MTUuLmJhNDczZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAxMGJmYmQyLi42MDAzYTMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFudC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywxMyArMywxMyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hbnQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKIEltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudCwKLSAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIKKyAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFudDt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iNi4wLjEiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW50O3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuYXBhY2hlLnRvb2xzLmFudCwKICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IGMzZWJmYjMuLmQwZGM1YzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hbnQgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYW50O3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5hbnQ7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9wb20ueG1sCmluZGV4IDQ0NDhmMmUuLmE3ZjI1OGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvcG9tLnhtbApAQCAtMTUsNyArMTUsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuYW50PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDYyZmU1YTUuLjNmYzhkZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCkBAIC0xMywxNyArMTMsMTcgQEAKICBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuY29tcHJlc3NvcnMuYnppcDI7dmVyc2lvbj0iWzEuNCwyLjApIiwKICBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuY29tcHJlc3NvcnMuZ3ppcDt2ZXJzaW9uPSJbMS40LDIuMCkiLAogIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5jb21wcmVzc29ycy54ejt2ZXJzaW9uPSJbMS40LDIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUuRm9ybWF0QWN0aXZhdG9yCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlO3ZlcnNpb249IjYuMC4xIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5hcmNoaXZlcnMsCiAgICBvcmcub3NnaS5mcmFtZXdvcmsiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5pbnRlcm5hbDt2ZXJzaW9uPSI2LjAuMSI7eC1pbnRlcm5hbDo9dHJ1ZQorIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5pbnRlcm5hbDt2ZXJzaW9uPSI2LjEuMSI7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggZGVhYjJmYS4uOGM3ZmQwNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZSAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvcG9tLnhtbAppbmRleCA0NWYxMWRhLi4xMmYzZTY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYmVuY2htYXJrcy9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzL3BvbS54bWwKaW5kZXggNTVjODBjNi4uYWMxZDZiZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzL3BvbS54bWwKQEAgLTE0LDcgKzE0LDcgQEAKICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+Ci0gIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5iZW5jaG1hcmtzPC9hcnRpZmFjdElkPgogICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmNvdmVyYWdlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmNvdmVyYWdlL3BvbS54bWwKaW5kZXggNjNlYWQyNy4uYWJjMzdlYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5jb3ZlcmFnZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuY292ZXJhZ2UvcG9tLnhtbApAQCAtMTQsNyArMTQsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CiAKQEAgLTI3LDg4ICsyNyw4OCBAQAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5sZnM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnBnbTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudWk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KIAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9CVUlMRCBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QvQlVJTEQKaW5kZXggMzViMTI1Zi4uOWU1ODEzYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9CVUlMRAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L0JVSUxECkBAIC0xMCw4ICsxMCw4IEBACiBqdW5pdF90ZXN0cygKICAgICBuYW1lID0gImJjIiwKICAgICBzcmNzID0gZ2xvYihbInRzdC8qKi8qLmphdmEiXSksCi0gICAgcmVzb3VyY2VfamFycyA9IFsiOnRzdF9yc3JjIl0sCiAgICAgdGFncyA9IFsiYmMiXSwKKyAgICBydW50aW1lX2RlcHMgPSBbIjp0c3RfcnNyYyJdLAogICAgIGRlcHMgPSBbCiAgICAgICAgICIvL2xpYjpiY3BnIiwKICAgICAgICAgIi8vbGliOmJjcHJvdiIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBkNzAzNDMyLi5iYjliMzkzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKQEAgLTEyLDkgKzEyLDkgQEAKICBvcmcuYm91bmN5Y2FzdGxlLm9wZW5wZ3Aub3BlcmF0b3I7dmVyc2lvbj0iWzEuNjUuMCwyLjAuMCkiLAogIG9yZy5ib3VuY3ljYXN0bGUub3BlbnBncC5vcGVyYXRvci5qY2FqY2U7dmVyc2lvbj0iWzEuNjUuMCwyLjAuMCkiLAogIG9yZy5ib3VuY3ljYXN0bGUudXRpbC5lbmNvZGVyczt2ZXJzaW9uPSJbMS42NS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuaW50ZXJuYWwua2V5czt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5pbnRlcm5hbC5rZXlzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVyO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0L3BvbS54bWwKaW5kZXggYWQ5NTViMC4uOTU2OGM2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDc0ZTMzMDUuLjUzNDU2OGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDEwICszLDEwIEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYztzaW5nbGV0b246PXRydWUKLUZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmpnaXQ7YnVuZGxlLXZlcnNpb249Ils2LjAuMSw2LjEuMCkiCitGcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5qZ2l0O2J1bmRsZS12ZXJzaW9uPSJbNi4xLjEsNi4yLjApIgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQogSW1wb3J0LVBhY2thZ2U6IG9yZy5ib3VuY3ljYXN0bGUuYXNuMTt2ZXJzaW9uPSJbMS42OS4wLDIuMC4wKSIsCiAgb3JnLmJvdW5jeWNhc3RsZS5hc24xLmNyeXB0bGliO3ZlcnNpb249IlsxLjY5LjAsMi4wLjApIiwKQEAgLTI5LDkgKzI5LDkgQEAKICBvcmcuYm91bmN5Y2FzdGxlLnV0aWw7dmVyc2lvbj0iWzEuNjkuMCwyLjAuMCkiLAogIG9yZy5ib3VuY3ljYXN0bGUudXRpbC5lbmNvZGVyczt2ZXJzaW9uPSJbMS42OS4wLDIuMC4wKSIsCiAgb3JnLmJvdW5jeWNhc3RsZS51dGlsLmlvO3ZlcnNpb249IlsxLjY5LjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuc2xmNGo7dmVyc2lvbj0iWzEuNy4wLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYzt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuaW50ZXJuYWw7dmVyc2lvbj0iNi4wLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmludGVybmFsLmtleXM7dmVyc2lvbj0iNi4wLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLnRlc3QiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5ncGcuYmM7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmludGVybmFsO3ZlcnNpb249IjYuMS4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5pbnRlcm5hbC5rZXlzO3ZlcnNpb249IjYuMS4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0IgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IGRlNDk2MmIuLjIwZTJkMDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5ncGcuYmM7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy9wb20ueG1sCmluZGV4IDRiZjgyYzYuLjEzOGY0ZTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggYzUxYTg3ZS4uYWZjYWE3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcgKzMsNyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCkBAIC0yNSwxMSArMjUsMTEgQEAKICBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uO3ZlcnNpb249Ils0LjQuMCw1LjAuMCkiLAogIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXM7dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLnNzbDt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuYXBhY2hlLmh0dHAuY2xpZW50LAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cCwKICAgIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IDlkNGY1ZjIuLjdiOGUxNDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZTt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbAppbmRleCA2ZTVmMjYwLi5iZDM1NTg5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9wb20ueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzMyYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlciIgdmVyc2lvbj0iMiI+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tFcnJvckhhbmRsZXIuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5VcGxvYWRQYWNrRXJyb3JIYW5kbGVyIj4KKyAgICAgICAgPGZpbHRlciBpZD0iMTIxMDA1NjcwNyI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjYuMS4xIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9InN0YXR1c0NvZGVGb3JUaHJvd2FibGUoVGhyb3dhYmxlKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKzwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNTEwYzQzOS4uNGJmNjZhMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDEzICszLDEzIEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249IjYuMC4xIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLmdsdWU7dmVyc2lvbj0iNi4wLjEiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0LGphdmF4LnNlcnZsZXQuaHR0cCIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCkBAIC0xOCwxNCArMTgsMTQgQEAKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKIEltcG9ydC1QYWNrYWdlOiBqYXZheC5zZXJ2bGV0O3ZlcnNpb249IlsyLjUuMCw1LjAuMCkiLAogIGphdmF4LnNlcnZsZXQuaHR0cDt2ZXJzaW9uPSJbMi41LjAsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQucGFyc2VyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIKKyBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQucGFyc2VyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggNzQ1M2NiOC4uMmI0NzA1NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlciAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sCmluZGV4IGIwMWM3OTEuLjZhNzg4ZTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3BvbS54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9HaXRTbWFydEh0dHBUb29scy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9HaXRTbWFydEh0dHBUb29scy5qYXZhCmluZGV4IDAxMmY5YTMuLmYxMTU1ZGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvR2l0U21hcnRIdHRwVG9vbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNtYXJ0SHR0cFRvb2xzLmphdmEKQEAgLTE1OCwxMSArMTU4LDExIEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAkJfQogCiAJCWlmIChpc0luZm9SZWZzKHJlcSkpIHsKLQkJCXNlbmRJbmZvUmVmc0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0KTsKKwkJCXNlbmRJbmZvUmVmc0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0LCBodHRwU3RhdHVzKTsKIAkJfSBlbHNlIGlmIChpc1VwbG9hZFBhY2socmVxKSkgewotCQkJc2VuZFVwbG9hZFBhY2tFcnJvcihyZXEsIHJlcywgdGV4dEZvckdpdCk7CisJCQlzZW5kVXBsb2FkUGFja0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0LCBodHRwU3RhdHVzKTsKIAkJfSBlbHNlIGlmIChpc1JlY2VpdmVQYWNrKHJlcSkpIHsKLQkJCXNlbmRSZWNlaXZlUGFja0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0KTsKKwkJCXNlbmRSZWNlaXZlUGFja0Vycm9yKHJlcSwgcmVzLCB0ZXh0Rm9yR2l0LCBodHRwU3RhdHVzKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChodHRwU3RhdHVzIDwgNDAwKQogCQkJCVNlcnZsZXRVdGlscy5jb25zdW1lUmVxdWVzdEJvZHkocmVxKTsKQEAgLTE3MSwyOSArMTcxLDMyIEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBzZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmRJbmZvUmVmc0Vycm9yKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0JCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgU3RyaW5nIHRleHRGb3JHaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgU3RyaW5nIHRleHRGb3JHaXQsIGludCBodHRwU3RhdHVzKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTI4KTsKIAkJUGFja2V0TGluZU91dCBwY2sgPSBuZXcgUGFja2V0TGluZU91dChidWYpOwogCQlTdHJpbmcgc3ZjID0gcmVxLmdldFBhcmFtZXRlcigic2VydmljZSIpOwogCQlwY2sud3JpdGVTdHJpbmcoIiMgc2VydmljZT0iICsgc3ZjICsgIlxuIik7CiAJCXBjay5lbmQoKTsKIAkJcGNrLndyaXRlU3RyaW5nKCJFUlIgIiArIHRleHRGb3JHaXQpOwotCQlzZW5kKHJlcSwgcmVzLCBpbmZvUmVmc1Jlc3VsdFR5cGUoc3ZjKSwgYnVmLnRvQnl0ZUFycmF5KCkpOworCQlzZW5kKHJlcSwgcmVzLCBpbmZvUmVmc1Jlc3VsdFR5cGUoc3ZjKSwgYnVmLnRvQnl0ZUFycmF5KCksIGh0dHBTdGF0dXMpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIHZvaWQgc2VuZFVwbG9hZFBhY2tFcnJvcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0LCBpbnQgaHR0cFN0YXR1cykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIERvIG5vdCB1c2Ugc2lkZWJhbmQuIFNpZGViYW5kIGlzIGFjY2VwdGFibGUgb25seSB3aGlsZSBwYWNrZmlsZSBpcwogCQkvLyBiZWluZyBzZW50LiBPdGhlciBwbGFjZXMsIGxpa2UgYWNrbm93bGVkZ2VtZW50IHNlY3Rpb24sIGRvIG5vdAogCQkvLyBzdXBwb3J0IHNpZGViYW5kLiBVc2UgYW4gZXJyb3IgcGFja2V0LgogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMjgpOwogCQlQYWNrZXRMaW5lT3V0IHBja091dCA9IG5ldyBQYWNrZXRMaW5lT3V0KGJ1Zik7CiAJCXdyaXRlUGFja2V0KHBja091dCwgdGV4dEZvckdpdCk7Ci0JCXNlbmQocmVxLCByZXMsIFVQTE9BRF9QQUNLX1JFU1VMVF9UWVBFLCBidWYudG9CeXRlQXJyYXkoKSk7CisJCXNlbmQocmVxLCByZXMsIFVQTE9BRF9QQUNLX1JFU1VMVF9UWVBFLCBidWYudG9CeXRlQXJyYXkoKSwgaHR0cFN0YXR1cyk7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kUmVjZWl2ZVBhY2tFcnJvcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyB0ZXh0Rm9yR2l0LCBpbnQgaHR0cFN0YXR1cykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEyOCk7CiAJCVBhY2tldExpbmVPdXQgcGNrT3V0ID0gbmV3IFBhY2tldExpbmVPdXQoYnVmKTsKIApAQCAtMjEyLDcgKzIxNSw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgc2VuZFJlY2VpdmVQYWNrRXJyb3IoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAkJCXdyaXRlU2lkZUJhbmQoYnVmLCB0ZXh0Rm9yR2l0KTsKIAkJZWxzZQogCQkJd3JpdGVQYWNrZXQocGNrT3V0LCB0ZXh0Rm9yR2l0KTsKLQkJc2VuZChyZXEsIHJlcywgUkVDRUlWRV9QQUNLX1JFU1VMVF9UWVBFLCBidWYudG9CeXRlQXJyYXkoKSk7CisJCXNlbmQocmVxLCByZXMsIFJFQ0VJVkVfUEFDS19SRVNVTFRfVFlQRSwgYnVmLnRvQnl0ZUFycmF5KCksIGh0dHBTdGF0dXMpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSZWNlaXZlUGFja1NpZGVCYW5kKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKQEAgLTI0Niw5ICsyNDksOSBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlUGFja2V0KFBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgdGV4dEZvckdpdCkKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCi0JCQlTdHJpbmcgdHlwZSwgYnl0ZVtdIGJ1ZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCVN0cmluZyB0eXBlLCBieXRlW10gYnVmLCBpbnQgaHR0cFN0YXR1cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJU2VydmxldFV0aWxzLmNvbnN1bWVSZXF1ZXN0Qm9keShyZXEpOwotCQlyZXMuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOworCQlyZXMuc2V0U3RhdHVzKGh0dHBTdGF0dXMpOwogCQlyZXMuc2V0Q29udGVudFR5cGUodHlwZSk7CiAJCXJlcy5zZXRDb250ZW50TGVuZ3RoKGJ1Zi5sZW5ndGgpOwogCQl0cnkgKE91dHB1dFN0cmVhbSBvcyA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrRXJyb3JIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tFcnJvckhhbmRsZXIuamF2YQppbmRleCAwM2JlMDg3Li4yYWFkYmJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tFcnJvckhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tFcnJvckhhbmRsZXIuamF2YQpAQCAtOSwxMyArOSwxOSBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7CiAKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfRk9SQklEREVOOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX09LOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5QYWNrUHJvdG9jb2xFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVwbG9hZFBhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb247CiAKIC8qKgogICogSGFuZGxlIGdpdC11cGxvYWQtcGFjayBlcnJvcnMuCkBAIC0zNSw2ICs0MSwyNCBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFVwbG9hZFBhY2tFcnJvckhhbmRsZXIgewogCS8qKgorCSAqIE1hcHMgYSB0aHJvd24gZ2l0IHJlbGF0ZWQgRXhjZXB0aW9uIHRvIGFuIGFwcHJvcHJpYXRlIEhUVFAgc3RhdHVzIGNvZGUuCisJICoKKwkgKiBAcGFyYW0gZXJyb3IKKwkgKiAgICAgICAgICAgIFRoZSB0aHJvd24gRXhjZXB0aW9uLgorCSAqIEByZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgYXMgYW4gaW50CisJICogQHNpbmNlIDYuMS4xCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgc3RhdHVzQ29kZUZvclRocm93YWJsZShUaHJvd2FibGUgZXJyb3IpIHsKKwkJaWYgKGVycm9yIGluc3RhbmNlb2YgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24pIHsKKwkJCXJldHVybiBTQ19GT1JCSURERU47CisJCX0KKwkJaWYgKGVycm9yIGluc3RhbmNlb2YgUGFja1Byb3RvY29sRXhjZXB0aW9uKSB7CisJCQkvLyBJbnRlcm5hbCBnaXQgZXJyb3JzIGFyZSBub3QgZXJyb3JzIGZyb20gYW4gSFRUUCBzdGFuZHBvaW50LgorCQkJcmV0dXJuIFNDX09LOworCQl9CisJCXJldHVybiBTQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisJfQorCS8qKgogCSAqIEBwYXJhbSByZXEKIAkgKiAgICAgICAgICAgIFRoZSBIVFRQIHJlcXVlc3QKIAkgKiBAcGFyYW0gcnNwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEKaW5kZXggYzRmODQ1ZS4uYjBhMDdmMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVXBsb2FkUGFja1NlcnZsZXQuamF2YQpAQCAtMTEsNyArMTEsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyOwogCiBpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTjsKLWltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQ7CiBpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX1VOU1VQUE9SVEVEX01FRElBX1RZUEU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuR2l0U21hcnRIdHRwVG9vbHMuVVBMT0FEX1BBQ0s7CkBAIC0yMiw2ICsyMSw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzLmNvbnN1bWVSZXF1ZXN0Qm9keTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5TZXJ2bGV0VXRpbHMuZ2V0SW5wdXRTdHJlYW07CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuVXBsb2FkUGFja0Vycm9ySGFuZGxlci5zdGF0dXNDb2RlRm9yVGhyb3dhYmxlOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQuSERSX1VTRVJfQUdFTlQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMTY5LDYgKzE2OSw3IEBAIHB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJzcCkKIAogCQlVcGxvYWRQYWNrUnVubmFibGUgciA9ICgpIC0+IHsKIAkJCVVwbG9hZFBhY2sgdXAgPSAoVXBsb2FkUGFjaykgcmVxLmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfSEFORExFUik7CisJCQkvLyB0byBiZSBleHBsaWNpdGx5IGNsb3NlZCBieSBjYWxsZXIKIAkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJCQlTbWFydE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgU21hcnRPdXRwdXRTdHJlYW0ocmVxLCByc3AsIGZhbHNlKSB7CiAJCQkJQE92ZXJyaWRlCkBAIC0yMTcsOSArMjE4LDEyIEBAIHByaXZhdGUgdm9pZCBkZWZhdWx0VXBsb2FkUGFja0hhbmRsZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAkJCWxvZyh1cC5nZXRSZXBvc2l0b3J5KCksIGUpOwogCQkJaWYgKCFyc3AuaXNDb21taXR0ZWQoKSkgewogCQkJCXJzcC5yZXNldCgpOwotCQkJCVN0cmluZyBtc2cgPSBlIGluc3RhbmNlb2YgUGFja1Byb3RvY29sRXhjZXB0aW9uID8gZS5nZXRNZXNzYWdlKCkKLQkJCQkJCTogbnVsbDsKLQkJCQlzZW5kRXJyb3IocmVxLCByc3AsIFNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgbXNnKTsKKwkJCQlTdHJpbmcgbXNnID0gbnVsbDsKKwkJCQlpZiAoZSBpbnN0YW5jZW9mIFBhY2tQcm90b2NvbEV4Y2VwdGlvbgorCQkJCQkJfHwgZSBpbnN0YW5jZW9mIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uKSB7CisJCQkJCW1zZyA9IGUuZ2V0TWVzc2FnZSgpOworCQkJCX0KKwkJCQlzZW5kRXJyb3IocmVxLCByc3AsIHN0YXR1c0NvZGVGb3JUaHJvd2FibGUoZSksIG1zZyk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDNhNjUxN2MuLjQxNTBiZGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcgKzMsNyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKQEAgLTI2LDI2ICsyNiwyNiBAQAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwubG9nO3ZlcnNpb249IlsxMC4wLjAsMTEuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwudGhyZWFkO3ZlcnNpb249IlsxMC4wLjAsMTEuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLmdsdWU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9wb20ueG1sCmluZGV4IDc2OTRjNDQuLjMzNmY0M2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvcG9tLnhtbApAQCAtMTgsNyArMTgsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0hvb2tNZXNzYWdlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0hvb2tNZXNzYWdlVGVzdC5qYXZhCmluZGV4IGRiOWYyYWUuLjIwZGUyNTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Ib29rTWVzc2FnZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSG9va01lc3NhZ2VUZXN0LmphdmEKQEAgLTk3LDYgKzk3LDcgQEAgcHVibGljIFJlY2VpdmVQYWNrIGNyZWF0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBSZXBvc2l0b3J5IGRiKQogCQlzZXJ2ZXIuc2V0VXAoKTsKIAogCQlyZW1vdGVSZXBvc2l0b3J5ID0gc3JjLmdldFJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UocmVtb3RlUmVwb3NpdG9yeSk7CiAJCXJlbW90ZVVSSSA9IHRvVVJJaXNoKGFwcCwgc3JjTmFtZSk7CiAKIAkJU3RvcmVkQ29uZmlnIGNmZyA9IHJlbW90ZVJlcG9zaXRvcnkuZ2V0Q29uZmlnKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSHR0cENsaWVudFRlc3RzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSHR0cENsaWVudFRlc3RzLmphdmEKaW5kZXggZGYwOTNjMS4uMzQzOGM1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9IdHRwQ2xpZW50VGVzdHMuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwpAQCAtMzA4LDcgKzMwOSwxMCBAQCBwdWJsaWMgdm9pZCB0ZXN0TGlzdFJlbW90ZV9TbWFydF9VcGxvYWRQYWNrRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlmYWlsKCJjb25uZWN0aW9uIG9wZW5lZCBldmVuIHRob3VnaCBzZXJ2aWNlIGRpc2FibGVkIik7CiAJCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZXJyKSB7CiAJCQkJU3RyaW5nIGV4cCA9IHNtYXJ0QXV0aE5vbmVVUkkgKyAiOiAiCi0JCQkJCQkrIEpHaXRUZXh0LmdldCgpLnNlcnZpY2VOb3RFbmFibGVkTm9OYW1lOworCQkJCQkJKyBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQkJSkdpdFRleHQuZ2V0KCkuc2VydmljZU5vdFBlcm1pdHRlZCwKKwkJCQkJCQkJc21hcnRBdXRoTm9uZVVSSS50b1N0cmluZygpICsgIi8iLAorCQkJCQkJCQkiZ2l0LXVwbG9hZC1wYWNrIik7CiAJCQkJYXNzZXJ0RXF1YWxzKGV4cCwgZXJyLmdldE1lc3NhZ2UoKSk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9NZWFzdXJlUGFja1NpemVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvTWVhc3VyZVBhY2tTaXplVGVzdC5qYXZhCmluZGV4IDlmZmExOWUuLjAwMGVlY2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9NZWFzdXJlUGFja1NpemVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L01lYXN1cmVQYWNrU2l6ZVRlc3QuamF2YQpAQCAtOTAsNiArOTAsNyBAQCBwdWJsaWMgUmVjZWl2ZVBhY2sgY3JlYXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFJlcG9zaXRvcnkgZGIpCiAJCXNlcnZlci5zZXRVcCgpOwogCiAJCXJlbW90ZVJlcG9zaXRvcnkgPSBzcmMuZ2V0UmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShyZW1vdGVSZXBvc2l0b3J5KTsKIAkJcmVtb3RlVVJJID0gdG9VUklpc2goYXBwLCBzcmNOYW1lKTsKIAogCQlTdG9yZWRDb25maWcgY2ZnID0gcmVtb3RlUmVwb3NpdG9yeS5nZXRDb25maWcoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TbWFydENsaWVudFNtYXJ0U2VydmVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEKaW5kZXggODg3ZTk3MC4uYjliMTBiNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0LlNlcnZsZXRIb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlRyYW5zcG9ydENvbmZpZ0NhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5VbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuR2l0U2VydmxldDsKQEAgLTQ5Niw4ICs0OTYsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0TGlzdFJlbW90ZV9CYWROYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQl0Lm9wZW5GZXRjaCgpOwogCQkJCWZhaWwoImZldGNoIGNvbm5lY3Rpb24gb3BlbmVkIik7Ci0JCQl9IGNhdGNoIChSZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uIG5vdEZvdW5kKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKHVyaSArICI6IEdpdCByZXBvc2l0b3J5IG5vdCBmb3VuZCIsCisJCQl9IGNhdGNoIChOb1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb24gbm90Rm91bmQpIHsKKwkJCQlhc3NlcnRFcXVhbHModXJpICsgIjogIiArIHVyaQorCQkJCQkJKyAiL2luZm8vcmVmcz9zZXJ2aWNlPWdpdC11cGxvYWQtcGFjayBub3QgZm91bmQ6IE5vdCBGb3VuZCIsCiAJCQkJCQlub3RGb3VuZC5nZXRNZXNzYWdlKCkpOwogCQkJfQogCQl9CkBAIC01MTAsNyArNTExLDcgQEAgcHVibGljIHZvaWQgdGVzdExpc3RSZW1vdGVfQmFkTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGpvaW4odXJpLCAiaW5mby9yZWZzIiksIGluZm8uZ2V0UGF0aCgpKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIGluZm8uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CiAJCWFzc2VydEVxdWFscygiZ2l0LXVwbG9hZC1wYWNrIiwgaW5mby5nZXRQYXJhbWV0ZXIoInNlcnZpY2UiKSk7Ci0JCWFzc2VydEVxdWFscygyMDAsIGluZm8uZ2V0U3RhdHVzKCkpOworCQlhc3NlcnRFcXVhbHMoNDA0LCBpbmZvLmdldFN0YXR1cygpKTsKIAkJYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi94LWdpdC11cGxvYWQtcGFjay1hZHZlcnRpc2VtZW50IiwKIAkJCQlpbmZvLmdldFJlc3BvbnNlSGVhZGVyKEhEUl9DT05URU5UX1RZUEUpKTsKIAl9CkBAIC01MzgsNiArNTM5LDcgQEAgcHVibGljIHZvaWQgdGVzdEZldGNoQnlTSEExVW5yZWFjaGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoCiAJCQkJCSJ3YW50ICIgKyB1bnJlYWNoYWJsZUNvbW1pdC5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKIAkJfQorCQlhc3NlcnRMYXN0UmVxdWVzdFN0YXR1c0NvZGUoMjAwKTsKIAl9CiAKIAlAVGVzdApAQCAtNTYwLDYgKzU2Miw3IEBAIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBSZWY+IGdldEFkdmVydGlzZWRSZWZzKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwKIAkJCWFzc2VydFRydWUoCiAJCQkJCWUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJ3YW50ICIgKyBBLm5hbWUoKSArICIgbm90IHZhbGlkIikpOwogCQl9CisJCWFzc2VydExhc3RSZXF1ZXN0U3RhdHVzQ29kZSgyMDApOwogCX0KIAogCUBUZXN0CkBAIC05MTYsNiArOTE5LDcgQEAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxDbG9uZV9SZWRpcmVjdE9uUG9zdEZvcmJpZGRlbigpIHRocm93cyBFeGNlcHRpb24gewogCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkgewogCQkJYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygiMzAxIikpOwogCQl9CisJCWFzc2VydExhc3RSZXF1ZXN0U3RhdHVzQ29kZSgzMDEpOwogCX0KIAogCUBUZXN0CkBAIC05MzQsNiArOTM4LDcgQEAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxDbG9uZV9SZWRpcmVjdEZvcmJpZGRlbigpIHRocm93cyBFeGNlcHRpb24gewogCQkJYXNzZXJ0VHJ1ZSgKIAkJCQkJZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoImh0dHAuZm9sbG93UmVkaXJlY3RzIGlzIGZhbHNlIikpOwogCQl9CisJCWFzc2VydExhc3RSZXF1ZXN0U3RhdHVzQ29kZSgzMDEpOwogCX0KIAogCXByaXZhdGUgdm9pZCBhc3NlcnRGZXRjaFJlcXVlc3RzKExpc3Q8QWNjZXNzRXZlbnQ+IHJlcXVlc3RzLCBpbnQgaW5kZXgpIHsKQEAgLTE2MDcsNiArMTYxMiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkV2FudCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJYXNzZXJ0VHJ1ZShlcnIuZ2V0TWVzc2FnZSgpCiAJCQkJCS5jb250YWlucygid2FudCAiICsgaWQubmFtZSgpICsgIiBub3QgdmFsaWQiKSk7CiAJCX0KKwkJYXNzZXJ0TGFzdFJlcXVlc3RTdGF0dXNDb2RlKDIwMCk7CiAJfQogCiAJQFRlc3QKQEAgLTE2NTAsNyArMTY1Niw3IEBAIHB1YmxpYyB2b2lkIHRlc3RGZXRjaF9SZWZzVW5yZWFkYWJsZU9uVXBsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJZmFpbCgiU3VjY2Vzc2Z1bGx5IHNlcnZlZCByZWYgd2l0aCB2YWx1ZSAiICsgYy5nZXRSZWYobWFzdGVyKSk7CiAJCQl9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZXJyKSB7CiAJCQkJYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBleGNlcHRpb24gbWVzc2FnZSAiICsgZXJyLmdldE1lc3NhZ2UoKSwKLQkJCQkJCWVyci5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkludGVybmFsIHNlcnZlciBlcnJvciIpKTsKKwkJCQkJCWVyci5nZXRNZXNzYWdlKCkuY29udGFpbnMoIlNlcnZlciBFcnJvciIpKTsKIAkJCX0KIAkJfSBmaW5hbGx5IHsKIAkJCW5vUmVmU2VydmVyLnRlYXJEb3duKCk7CkBAIC0xODIxLDYgKzE4MjcsMTEgQEAgcHVibGljIHZvaWQgdGVzdFB1c2hfQ2h1bmtlZEVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJLmdldFJlc3BvbnNlSGVhZGVyKEhEUl9DT05URU5UX1RZUEUpKTsKIAl9CiAKKwlwcml2YXRlIHZvaWQgYXNzZXJ0TGFzdFJlcXVlc3RTdGF0dXNDb2RlKGludCBzdGF0dXNDb2RlKSB7CisJCUxpc3Q8QWNjZXNzRXZlbnQ+IHJlcXVlc3RzID0gZ2V0UmVxdWVzdHMoKTsKKwkJYXNzZXJ0RXF1YWxzKHN0YXR1c0NvZGUsIHJlcXVlc3RzLmdldChyZXF1ZXN0cy5zaXplKCkgLSAxKS5nZXRTdGF0dXMoKSk7CisJfQorCiAJcHJpdmF0ZSB2b2lkIGVuYWJsZVJlY2VpdmVQYWNrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RvcmVkQ29uZmlnIGNmZyA9IHJlbW90ZVJlcG9zaXRvcnkuZ2V0Q29uZmlnKCk7CiAJCWNmZy5zZXRCb29sZWFuKCJodHRwIiwgbnVsbCwgInJlY2VpdmVwYWNrIiwgdHJ1ZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggYzIxZjgzNS4uZDAzNTA3MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CkBAIC0yMSwxNyArMjEsMTcgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzEwLjAuMCwxMS4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnNzbDt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuc2xmNGouaGVscGVyczt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSI2LjAuMSI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC5qdW5pdCwKICAgIGphdmF4LnNlcnZsZXQuaHR0cCwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IDk4ZmRlMDYuLjE5MTQyYzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA7dmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwKaW5kZXggYjY2OTkxZi4uZDg4M2UwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9IdHRwVGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0h0dHBUZXN0Q2FzZS5qYXZhCmluZGV4IDNlN2M4NGYuLjg3N2I5MTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0h0dHBUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0h0dHBUZXN0Q2FzZS5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQuU2VydmxldENvbnRleHRIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlLkZpbGVSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CkBAIC04MCw3ICs4MSw5IEBAIHByb3RlY3RlZCBBcHBTZXJ2ZXIgY3JlYXRlU2VydmVyKCkgewogCSAqLwogCXByb3RlY3RlZCBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBjcmVhdGVUZXN0UmVwb3NpdG9yeSgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RSZXBvc2l0b3J5PD4oY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSk7CisJCWZpbmFsIEZpbGVSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShyZXBvc2l0b3J5KTsKKwkJcmV0dXJuIG5ldyBUZXN0UmVwb3NpdG9yeTw+KHJlcG9zaXRvcnkpOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA4ZDYyOWVkLi42MDg1OGQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw0NiArMyw0NiBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1JbXBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5zc2hkLmNvbW1vbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uZmlsZS52aXJ0dWFsZnM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5oZWxwZXJzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaW87dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXg7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXlwcm92aWRlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zaWduYXR1cmU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwubG9nZ2luZzt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLnRocmVhZHM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvcmU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGg7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoLmdzczt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGgua2V5Ym9hcmQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoLnBhc3N3b3JkO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuY29tbWFuZDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLnNlc3Npb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5zaGVsbDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLnN1YnN5c3RlbTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2Z0cDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2Z0cC5zZXJ2ZXI7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorSW1wb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuc3NoZC5jb21tb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5czt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmZpbGUudmlydHVhbGZzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaGVscGVyczt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmlvO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V5cHJvdmlkZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zZXNzaW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2lnbmF0dXJlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmxvZ2dpbmc7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLnNlY3VyaXR5O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC50aHJlYWRzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb3JlO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aC5nc3M7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5hdXRoLmtleWJvYXJkO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuYXV0aC5wYXNzd29yZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmNvbW1hbmQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5zZXNzaW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuc2hlbGw7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5zdWJzeXN0ZW07dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNmdHA7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNmdHAuc2VydmVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLnNsZjRqO3ZlcnNpb249IlsxLjcuMCwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2g7dmVyc2lvbj0iNi4wLjEiCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2g7dmVyc2lvbj0iNi4xLjEiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggNzEzMmI1Yi4uNDEyNDZiYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaCAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2g7dmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaDt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoL3BvbS54bWwKaW5kZXggNzZiZGNhMS4uMDdkMDIxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnNzaC9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2g8L2FydGlmYWN0SWQ+CkBAIC01NSw2ICs1NSwxNiBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zc2hkPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+c3NoZC1zZnRwPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+JHthcGFjaGUtc3NoZC12ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3NoZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3NoZC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3NoZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3NoZC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CiAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPGRlcGVuZGVuY3k+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Ly5zZXR0aW5ncy8uYXBpX2ZpbHRlcnMgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Ly5zZXR0aW5ncy8uYXBpX2ZpbHRlcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3YTcyZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxjb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQiIHZlcnNpb249IjIiPgorICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdC5Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UiPgorICAgICAgICA8ZmlsdGVyIGlkPSIzMzY2NTg0ODEiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJjdXJyZW50VGVzdCIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI2LjAuMSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJjdXJyZW50VGVzdCIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKzwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMWYwMjFkYS4uN2EzYjIwMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDM1ICszLDM1IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVyO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcnM7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVycy5tb2RlbDt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLAogIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iNi4wLjEiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLApAQCAtNDQsNCArNDQsNCBAQAogICAgb3JnLmp1bml0LnJ1bm5lcnMubW9kZWwsCiAgICBvcmcuanVuaXQucnVubmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWUiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQudGltZTt2ZXJzaW9uPSI2LjAuMSI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lIgorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQudGltZTt2ZXJzaW9uPSI2LjEuMSI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCAxNTZlNTlhLi4yNTg3NmM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0IC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249IjYuMS4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3BvbS54bWwKaW5kZXggZWYyYjk0Ni4uMmMyNjBlMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbApAQCAtMTksNyArMTksNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuanVuaXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YQppbmRleCA0OTRkMmYzLi41OTY2MmNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKQEAgLTQ1LDYgKzQ1LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3lzdGVtUmVhZGVyOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZXN0TmFtZTsKIAogLyoqCiAgKiBKVW5pdCBUZXN0Q2FzZSB3aXRoIHNwZWNpYWxpemVkIHN1cHBvcnQgZm9yIHRlbXBvcmFyeSBsb2NhbCByZXBvc2l0b3J5LgpAQCAtODQsMTggKzg2LDM1IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UgewogCXByaXZhdGUgRmlsZSB0bXA7CiAKIAkvKioKKwkgKiBUaGUgY3VycmVudCB0ZXN0IG5hbWUuCisJICoKKwkgKiBAc2luY2UgNi4wLjEKKwkgKi8KKwlAUnVsZQorCXB1YmxpYyBUZXN0TmFtZSBjdXJyZW50VGVzdCA9IG5ldyBUZXN0TmFtZSgpOworCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VGVzdE5hbWUoKSB7CisJCVN0cmluZyBuYW1lID0gY3VycmVudFRlc3QuZ2V0TWV0aG9kTmFtZSgpOworCQluYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJbXmEtekEtWjAtOV0iLCAiXyIpOworCQluYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJfXysiLCAiXyIpOworCQlpZiAobmFtZS5zdGFydHNXaXRoKCJfIikpIHsKKwkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKKwkJfQorCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKIAkgKiBTZXR1cCB0ZXN0CiAJICoKIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwogCUBCZWZvcmUKIAlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0bXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJqZ2l0X3Rlc3RfIiwgIl90bXAiKTsKKwkJdG1wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiamdpdF8iICsgZ2V0VGVzdE5hbWUoKSArICdfJywgIl90bXAiKTsKIAkJQ2xlYW51cFRocmVhZC5kZWxldGVPblNodXRkb3duKHRtcCk7CiAJCWlmICghdG1wLmRlbGV0ZSgpIHx8ICF0bXAubWtkaXIoKSkgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlICIgKyB0bXApOwogCQl9Ci0KIAkJbW9ja1N5c3RlbVJlYWRlciA9IG5ldyBNb2NrU3lzdGVtUmVhZGVyKCk7CiAJCVN5c3RlbVJlYWRlci5zZXRJbnN0YW5jZShtb2NrU3lzdGVtUmVhZGVyKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBiMmE4MmMyLi5jYmI4MTM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCkBAIC0yNiwyNCArMjYsMjQgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzEwLjAuMCwxMS4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnRocmVhZDt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9wb20ueG1sCmluZGV4IGVmODc1MWUuLjFiYWI2MjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9QdXNoVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9QdXNoVGVzdC5qYXZhCmluZGV4IDcwYzA0NjMuLjA2NzA4YjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvUHVzaFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1B1c2hUZXN0LmphdmEKQEAgLTExLDYgKzExLDcgQEAKIAogaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CkBAIC0yOSw2ICszMCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZS5GaWxlUmVwb3NpdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmU3BlYzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VUklpc2g7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlci5QYXRoRmlsdGVyOwpAQCAtMTI4LDQgKzEzMCwxOCBAQCBwdWJsaWMgdm9pZCB0ZXN0UHVzaFNpbXBsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCXNlcnZlci5nZXRSZXF1ZXN0cygpLnRvU3RyaW5nKCkpOwogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlbGV0ZUJyYW5jaCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYnJhbmNoID0gIm5ldy1icmFuY2giOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZShicmFuY2gpLmNhbGwoKTsKKworCQlTdHJpbmcgZGVzdFJlZiA9IENvbnN0YW50cy5SX0hFQURTICsgYnJhbmNoOworCQlnaXQucHVzaCgpLnNldFJlZlNwZWNzKG5ldyBSZWZTcGVjKCkuc2V0U291cmNlKGJyYW5jaCkuc2V0RGVzdGluYXRpb24oZGVzdFJlZikpLmNhbGwoKTsKKworCQkvLyBTaG91bGQgbm90IGZhaWwgb24gcHVzaC4KKwkJZ2l0LmJyYW5jaERlbGV0ZSgpLnNldEJyYW5jaE5hbWVzKGJyYW5jaCkuc2V0Rm9yY2UodHJ1ZSkuY2FsbCgpOworCQlnaXQucHVzaCgpLnNldFJlZlNwZWNzKG5ldyBSZWZTcGVjKCkuc2V0U291cmNlKG51bGwpLnNldERlc3RpbmF0aW9uKGRlc3RSZWYpKS5jYWxsKCk7CisKKwkJYXNzZXJ0VHJ1ZShzZXJ2ZXIuZ2V0UmVxdWVzdHMoKS5pc0VtcHR5KCkpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAzYTQ0NDhiLi5jZDhiZGUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDE5ICszLDE5IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcgogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249IjYuMC4xIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0iamF2YXguc2VydmxldC5odHRwLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0LAogICAgamF2YXguc2VydmxldC5odHRwLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuaW50ZXJuYWw7dmVyc2lvbj0iNi4wLjEiO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnMzO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuaW50ZXJuYWw7dmVyc2lvbj0iNi4xLjEiO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnMzO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYiIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKQEAgLTI0LDE1ICsyNCwxNSBAQAogIGphdmF4LnNlcnZsZXQuYW5ub3RhdGlvbjt2ZXJzaW9uPSJbMy4xLjAsNS4wLjApIiwKICBqYXZheC5zZXJ2bGV0Lmh0dHA7dmVyc2lvbj0iWzMuMS4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwO3ZlcnNpb249Ils0LjMuMCw1LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggNTAxMWEyMi4uNWE1YjIzYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlciAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAppbmRleCBjMmQ2NTk2Li5hZTI3MTUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGI4NzA3OTQuLmUzYzBhZjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywyNCArMywyNyBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCiAgb3JnLmhhbWNyZXN0LmNvcmU7dmVyc2lvbj0iWzEuMS4wLDMuMC4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcjt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXJzO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249IjYuMC4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdCIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249IjYuMS4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvcG9tLnhtbAppbmRleCBhODhjYTk0Li4xZDc4MmU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc0NvbmZpZ0dpdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc0NvbmZpZ0dpdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGEwNzEyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzQ29uZmlnR2l0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBNYXR0aGlhcyBGcm9tbWUgPG1mcm9tbWVAZHNwYWNlLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5SZXNldENvbW1hbmQuUmVzZXRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWwuTGZzQ29ubmVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBpZiB0aGUgbGZzIGNvbmZpZyBpcyB1c2VkIGluIHRoZSBjb3JyZWN0IHdheSBkdXJpbmcgY2hlY2tvdXQuCisgKgorICogVHdvIGxmcy1maWxlcyBhcmUgY3JlYXRlZCwgb25lIHRoYXQgY29tZXMgYmVmb3JlIC5naXRhdHRyaWJ1dGVzIGFuZAorICogLmxmc2NvbmZpZyBpbiBnaXQgb3JkZXIgKCIuYWFhLnR4dCIpIGFuZCBvbmUgdGhhdCBjb21lcyBhZnRlciAoInp6ei50eHQiKS4KKyAqCisgKiBEdXJpbmcgY2hlY2tvdXQvcmVzZXQgaXQgaXMgdGVzdGVkIGlmIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIGxmcyBjb25maWcKKyAqIGlzIHVzZWQuCisgKgorICogVE9ETzogVGhlIGN1cnJlbnQgYmVoYXZpb3Igc2VlbXMgYSBsaXR0bGUgYml0IHN0cmFuZ2UvdW5pbnR1aXRpdmUuIFNvbWUgZmlsZXMKKyAqIGFyZSBjaGVja2VkIG91dCBiZWZvcmUgYW5kIHNvbWUgYWZ0ZXIgdGhlIGNvbmZpZyBmaWxlcy4gVGhpcyBsZWFkcyB0byB0aGUKKyAqIGJlaGF2aW9yLCB0aGF0IGR1cmluZyBhIHNpbmdsZSBjb21tYW5kIHRoZSBjb25maWcgY2hhbmdlcy4gU2luY2UgdGhpcyBzZWVtcworICogdG8gYmUgdGhlIHNhbWUgd2F5IGluIG5hdGl2ZSBnaXQsIHRoZSBiZWhhdmlvciBpcyBhY2NlcHRlZCBmb3Igbm93LgorICoKKyAqLworcHVibGljIGNsYXNzIExmc0NvbmZpZ0dpdFRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNNVURHRV9OQU1FID0gb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkJVSUxUSU5fRklMVEVSX1BSRUZJWAorCQkJKyBDb25zdGFudHMuQVRUUl9GSUxURVJfRFJJVkVSX1BSRUZJWAorCQkJKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9TTVVER0U7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEZTX1NFUlZFUl9VUkkxID0gImh0dHBzOi8vbGZzLnNlcnZlcjEvdGVzdC91cmkiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1NFUlZFUl9VUkwxID0gTEZTX1NFUlZFUl9VUkkxCisJCQkrIFByb3RvY29sLk9CSkVDVFNfTEZTX0VORFBPSU5UOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExGU19TRVJWRVJfVVJJMiA9ICJodHRwczovL2xmcy5zZXJ2ZXIyL3Rlc3QvdXJpIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9TRVJWRVJfVVJMMiA9IExGU19TRVJWRVJfVVJJMgorCQkJKyBQcm90b2NvbC5PQkpFQ1RTX0xGU19FTkRQT0lOVDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRlNfU0VSVkVSX1VSSTMgPSAiaHR0cHM6Ly9sZnMuc2VydmVyMy90ZXN0L3VyaSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURURfU0VSVkVSX1VSTDMgPSBMRlNfU0VSVkVSX1VSSTMKKwkJCSsgUHJvdG9jb2wuT0JKRUNUU19MRlNfRU5EUE9JTlQ7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFLRV9MRlNfUE9JTlRFUjEgPSAidmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxXG4iCisJCQkrICJvaWQgc2hhMjU2OjZjZTlmYWI1MmVlOWE2YzRjMDk3ZGVmNGUwNDljNmFjZGViYTQ0Yzk5ZDI2ZTgzYmE4MGFkZWMxNDczYzliMmRcbiIKKwkJCSsgInNpemUgMjUzOTUyXG4iOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBS0VfTEZTX1BPSU5URVIyID0gInZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MVxuIgorCQkJKyAib2lkIHNoYTI1NjphNGI3MTFjZDk4OTg2M2FlMjAzODc1OGE2MjY3MjEzODM0N2FiYmJhZTQwNzZhN2FkM2E1NDVmZGE3ZDA4ZjgyXG4iCisJCQkrICJzaXplIDY3MDcyXG4iOworCisJcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGNoZWNrb3V0VVJMcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJc3RhdGljIGNsYXNzIFNtdWRnZUZpbHRlck1vY2sgZXh0ZW5kcyBGaWx0ZXJDb21tYW5kIHsKKwkJcHVibGljIFNtdWRnZUZpbHRlck1vY2soUmVwb3NpdG9yeSBkYiwgSW5wdXRTdHJlYW0gaW4sCisJCQkJT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXN1cGVyKGluLCBvdXQpOworCQkJSHR0cENvbm5lY3Rpb24gbGZzU2VydmVyQ29ubiA9IExmc0Nvbm5lY3Rpb25GYWN0b3J5LmdldExmc0Nvbm5lY3Rpb24oZGIsCisJCQkJCUh0dHBTdXBwb3J0Lk1FVEhPRF9QT1NULCBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQpOworCQkJY2hlY2tvdXRVUkxzLmFkZChsZnNTZXJ2ZXJDb25uLmdldFVSTCgpLnRvU3RyaW5nKCkpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCS8vIFN0dXBpZCBubyBpbXBsCisJCQlpbi50cmFuc2ZlclRvKG91dCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbExmcygpIHsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKFNNVURHRV9OQU1FLCBTbXVkZ2VGaWx0ZXJNb2NrOjpuZXcpOworCX0KKworCUBBZnRlckNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxmcygpIHsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnVucmVnaXN0ZXIoU01VREdFX05BTUUpOworCX0KKworCXByaXZhdGUgR2l0IGdpdDsKKworCUBPdmVycmlkZQorCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlnaXQgPSBuZXcgR2l0KGRiKTsKKwkJLy8gY29tbWl0IHNvbWV0aGluZworCQl3cml0ZVRyYXNoRmlsZSgiVGVzdC50eHQiLCAiSGVsbG8gd29ybGQiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJUZXN0LnR4dCIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkluaXRpYWwgY29tbWl0IikuY2FsbCgpOworCQkvLyBwcmVwYXJlIHRoZSBjb25maWcgZm9yIExGUworCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgImxmcyIsICJzbXVkZ2UiLCBTTVVER0VfTkFNRSk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQVVUT0NSTEYsICJmYWxzZSIpOworCQljb25maWcuc2F2ZSgpOworCisJCWZpbGVCZWZvcmUgPSBudWxsOworCQlmaWxlQWZ0ZXIgPSBudWxsOworCQljb25maWdGaWxlID0gbnVsbDsKKwkJZ2l0QXR0cmlidXRlc0ZpbGUgPSBudWxsOworCX0KKworCUZpbGUgZmlsZUJlZm9yZTsKKworCUZpbGUgZmlsZUFmdGVyOworCisJRmlsZSBjb25maWdGaWxlOworCisJRmlsZSBnaXRBdHRyaWJ1dGVzRmlsZTsKKworCXByaXZhdGUgdm9pZCBjcmVhdGVMZnNGaWxlcyhTdHJpbmcgbGZzUG9pbnRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8qCisJCSAqIEZpbGVOYW1lcyAiLmFhYS50eHQiIGFuZCAienp6LnR4dCIgc2VlbSB0byBiZSBzdWZmaWNpZW50IHRvIGdldCB0aGUKKwkJICogZGVzaXJlZCBjaGVja291dCBvcmRlciBiZWZvcmUgYW5kIGFmdGVyICIubGZzY29uZmlnIiwgYXQgbGVhc3QgaW4gYQorCQkgKiBudW1iZXIgb2YgbWFudWFsIHRyaWVzLiBTaW5jZSB0aGUgZmlsZXMgdG8gY2hlY2tvdXQgYXJlIGNvbnRhaW5lZCBpbgorCQkgKiBhIHNldCAoc2VlIERpckNhY2hlQ2hlY2tvdXQ6OmRvQ2hlY2tvdXQpIHRoZSBvcmRlciBjYW5ub3QgYmUKKwkJICogZ3VhcmFudGVlZC4KKwkJICovCisKKwkJLy9GaWxlIHRvIGJlIGNoZWNrZWQgb3V0IGJlZm9yZSBsZnMgY29uZmlnCisJCVN0cmluZyBmaWxlTmFtZUJlZm9yZSA9ICIuYWFhLnR4dCI7CisJCWZpbGVCZWZvcmUgPSB3cml0ZVRyYXNoRmlsZShmaWxlTmFtZUJlZm9yZSwgbGZzUG9pbnRlcik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihmaWxlTmFtZUJlZm9yZSkuY2FsbCgpOworCisJCS8vIEZpbGUgdG8gYmUgY2hlY2tlZCBvdXQgYWZ0ZXIgbGZzIGNvbmZpZworCQlTdHJpbmcgZmlsZU5hbWVBZnRlciA9ICJ6enoudHh0IjsKKwkJZmlsZUFmdGVyID0gd3JpdGVUcmFzaEZpbGUoZmlsZU5hbWVBZnRlciwgbGZzUG9pbnRlcik7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihmaWxlTmFtZUFmdGVyKS5jYWxsKCk7CisKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkNvbW1pdCBMRlMgUG9pbnRlciBmaWxlcyIpLmNhbGwoKTsKKwl9CisKKworCXByaXZhdGUgU3RyaW5nIGFkZExmc0NvbmZpZ0ZpbGVzKFN0cmluZyBsZnNTZXJ2ZXJVcmwpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBBZGQgY29uZmlnIGZpbGVzIHRvIHRoZSByZXBvCisJCVN0cmluZyBsZnNDb25maWcxID0gY3JlYXRlTGZzQ29uZmlnKGxmc1NlcnZlclVybCk7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihDb25zdGFudHMuRE9UX0xGU19DT05GSUcpLmNhbGwoKTsKKwkJLy8gTW9kaWZ5IGdpdGF0dHJpYnV0ZXMgb24gc2Vjb25kIGNhbGwsIHRvIGZvcmNlIGNoZWNrb3V0IHRvby4KKwkJaWYgKGdpdEF0dHJpYnV0ZXNGaWxlID09IG51bGwpIHsKKwkJCWdpdEF0dHJpYnV0ZXNGaWxlID0gd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwKKwkJCQkiKi50eHQgZmlsdGVyPWxmcyIpOworCQl9IGVsc2UgeworCQkJZ2l0QXR0cmlidXRlc0ZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLAorCQkJCQkiKi50eHQgZmlsdGVyPWxmc1xuIik7CisJCX0KKworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi5naXRhdHRyaWJ1dGVzIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiQ29tbWl0IGNvbmZpZyBmaWxlcyIpLmNhbGwoKTsKKwkJcmV0dXJuIGxmc0NvbmZpZzE7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTGZzQ29uZmlnKFN0cmluZyBsZnNTZXJ2ZXJVcmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBsZnNDb25maWcxID0gIltsZnNdXG4gICAgdXJsID0gIiArIGxmc1NlcnZlclVybDsKKwkJY29uZmlnRmlsZSA9IHdyaXRlVHJhc2hGaWxlKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRywgbGZzQ29uZmlnMSk7CisJCXJldHVybiBsZnNDb25maWcxOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tvdXRMZnNPYmplY3RzX3Jlc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNyZWF0ZUxmc0ZpbGVzKEZBS0VfTEZTX1BPSU5URVIxKTsKKwkJU3RyaW5nIGxmc0NvbmZpZzEgPSBhZGRMZnNDb25maWdGaWxlcyhMRlNfU0VSVkVSX1VSSTEpOworCisJCS8vIERlbGV0ZSBmaWxlcyB0byBmb3JjZSBhY3Rpb24gb24gcmVzZXQKKwkJYXNzZXJ0VHJ1ZShjb25maWdGaWxlLmRlbGV0ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShmaWxlQmVmb3JlLmRlbGV0ZSgpKTsKKwkJYXNzZXJ0VHJ1ZShmaWxlQWZ0ZXIuZGVsZXRlKCkpOworCisJCWFzc2VydFRydWUoZ2l0QXR0cmlidXRlc0ZpbGUuZGVsZXRlKCkpOworCisJCS8vIGNyZWF0ZSBjb25maWcgZmlsZSB3aXRoIGRpZmZlcmVudCB1cmwKKwkJY3JlYXRlTGZzQ29uZmlnKExGU19TRVJWRVJfVVJJMyk7CisKKwkJY2hlY2tvdXRVUkxzLmNsZWFyKCk7CisJCWdpdC5yZXNldCgpLnNldE1vZGUoUmVzZXRUeXBlLkhBUkQpLmNhbGwoKTsKKworCQljaGVja0ZpbGUoY29uZmlnRmlsZSwgbGZzQ29uZmlnMSk7CisJCWNoZWNrRmlsZShmaWxlQmVmb3JlLCBGQUtFX0xGU19QT0lOVEVSMSk7CisJCWNoZWNrRmlsZShmaWxlQWZ0ZXIsIEZBS0VfTEZTX1BPSU5URVIxKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgY2hlY2tvdXRVUkxzLnNpemUoKSk7CisJCS8vIFRPRE86IFNob3VsZCBtYXkgYmUgRVhQRUNURURfU0VSVlJfVVJMMQorCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDMsIGNoZWNrb3V0VVJMcy5nZXQoMCkpOworCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDEsIGNoZWNrb3V0VVJMcy5nZXQoMSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tvdXRMZnNPYmplY3RzX0JyYW5jaFN3aXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBDcmVhdGUgYSBuZXcgYnJhbmNoICJVUkwxIiBhbmQgYWRkIGNvbmZpZyBmaWxlcworCQlnaXQuY2hlY2tvdXQoKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuc2V0TmFtZSgiVVJMMSIpLmNhbGwoKTsKKworCQljcmVhdGVMZnNGaWxlcyhGQUtFX0xGU19QT0lOVEVSMSk7CisJCVN0cmluZyBsZnNDb25maWcxID0gYWRkTGZzQ29uZmlnRmlsZXMoTEZTX1NFUlZFUl9VUkkxKTsKKworCQkvLyBDcmVhdGUgYSBzZWNvbmQgbmV3IGJyYW5jaCAiVVJMMiIgYW5kIGFkZCBjb25maWcgZmlsZXMKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLnNldE5hbWUoIlVSTDIiKS5jYWxsKCk7CisKKwkJY3JlYXRlTGZzRmlsZXMoRkFLRV9MRlNfUE9JTlRFUjIpOworCQlTdHJpbmcgbGZzQ29uZmlnMiA9IGFkZExmc0NvbmZpZ0ZpbGVzKExGU19TRVJWRVJfVVJJMik7CisKKwkJY2hlY2tGaWxlKGNvbmZpZ0ZpbGUsIGxmc0NvbmZpZzIpOworCQljaGVja0ZpbGUoZmlsZUJlZm9yZSwgRkFLRV9MRlNfUE9JTlRFUjIpOworCQljaGVja0ZpbGUoZmlsZUFmdGVyLCBGQUtFX0xGU19QT0lOVEVSMik7CisKKwkJY2hlY2tvdXRVUkxzLmNsZWFyKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIlVSTDEiKS5jYWxsKCk7CisKKwkJY2hlY2tGaWxlKGNvbmZpZ0ZpbGUsIGxmc0NvbmZpZzEpOworCQljaGVja0ZpbGUoZmlsZUJlZm9yZSwgRkFLRV9MRlNfUE9JTlRFUjEpOworCQljaGVja0ZpbGUoZmlsZUFmdGVyLCBGQUtFX0xGU19QT0lOVEVSMSk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIGNoZWNrb3V0VVJMcy5zaXplKCkpOworCQkvLyBUT0RPOiBTaG91bGQgbWF5IGJlIEVYUEVDVEVEX1NFUlZSX1VSTDEKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwyLCBjaGVja291dFVSTHMuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwxLCBjaGVja291dFVSTHMuZ2V0KDEpKTsKKworCQljaGVja291dFVSTHMuY2xlYXIoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiVVJMMiIpLmNhbGwoKTsKKworCQljaGVja0ZpbGUoY29uZmlnRmlsZSwgbGZzQ29uZmlnMik7CisJCWNoZWNrRmlsZShmaWxlQmVmb3JlLCBGQUtFX0xGU19QT0lOVEVSMik7CisJCWNoZWNrRmlsZShmaWxlQWZ0ZXIsIEZBS0VfTEZTX1BPSU5URVIyKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgY2hlY2tvdXRVUkxzLnNpemUoKSk7CisJCS8vIFRPRE86IFNob3VsZCBtYXkgYmUgRVhQRUNURURfU0VSVlJfVVJMMgorCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDEsIGNoZWNrb3V0VVJMcy5nZXQoMCkpOworCQlhc3NlcnRFcXVhbHMoRVhQRUNURURfU0VSVkVSX1VSTDIsIGNoZWNrb3V0VVJMcy5nZXQoMSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgY2hlY2tvdXRMZnNPYmplY3RzX0JyYW5jaFN3aXRjaF9Nb2RpZmllZExvY2FsKCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCisJCS8vIENyZWF0ZSBhIG5ldyBicmFuY2ggIlVSTDEiIGFuZCBhZGQgY29uZmlnIGZpbGVzCisJCWdpdC5jaGVja291dCgpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5zZXROYW1lKCJVUkwxIikuY2FsbCgpOworCisJCWNyZWF0ZUxmc0ZpbGVzKEZBS0VfTEZTX1BPSU5URVIxKTsKKwkJYWRkTGZzQ29uZmlnRmlsZXMoTEZTX1NFUlZFUl9VUkkxKTsKKworCQkvLyBDcmVhdGUgYSBzZWNvbmQgbmV3IGJyYW5jaCAiVVJMMiIgYW5kIGFkZCBjb25maWcgZmlsZXMKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLnNldE5hbWUoIlVSTDIiKS5jYWxsKCk7CisKKwkJY3JlYXRlTGZzRmlsZXMoRkFLRV9MRlNfUE9JTlRFUjIpOworCQlhZGRMZnNDb25maWdGaWxlcyhMRlNfU0VSVkVSX1VSSTEpOworCisJCS8vIGNyZWF0ZSBjb25maWcgZmlsZSB3aXRoIGRpZmZlcmVudCB1cmwKKwkJYXNzZXJ0VHJ1ZShjb25maWdGaWxlLmRlbGV0ZSgpKTsKKwkJU3RyaW5nIGxmc0NvbmZpZzMgPSBjcmVhdGVMZnNDb25maWcoTEZTX1NFUlZFUl9VUkkzKTsKKworCQljaGVja0ZpbGUoY29uZmlnRmlsZSwgbGZzQ29uZmlnMyk7CisJCWNoZWNrRmlsZShmaWxlQmVmb3JlLCBGQUtFX0xGU19QT0lOVEVSMik7CisJCWNoZWNrRmlsZShmaWxlQWZ0ZXIsIEZBS0VfTEZTX1BPSU5URVIyKTsKKworCQljaGVja291dFVSTHMuY2xlYXIoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiVVJMMSIpLmNhbGwoKTsKKworCQljaGVja0ZpbGUoZmlsZUJlZm9yZSwgRkFLRV9MRlNfUE9JTlRFUjEpOworCQljaGVja0ZpbGUoZmlsZUFmdGVyLCBGQUtFX0xGU19QT0lOVEVSMSk7CisJCWNoZWNrRmlsZShjb25maWdGaWxlLCBsZnNDb25maWczKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgY2hlY2tvdXRVUkxzLnNpemUoKSk7CisKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwzLCBjaGVja291dFVSTHMuZ2V0KDApKTsKKwkJYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1NFUlZFUl9VUkwzLCBjaGVja291dFVSTHMuZ2V0KDEpKTsKKworCQljaGVja291dFVSTHMuY2xlYXIoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiVVJMMiIpLmNhbGwoKTsKKworCQljaGVja0ZpbGUoZmlsZUJlZm9yZSwgRkFLRV9MRlNfUE9JTlRFUjIpOworCQljaGVja0ZpbGUoZmlsZUFmdGVyLCBGQUtFX0xGU19QT0lOVEVSMik7CisJCWNoZWNrRmlsZShjb25maWdGaWxlLCBsZnNDb25maWczKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgY2hlY2tvdXRVUkxzLnNpemUoKSk7CisJCWFzc2VydEVxdWFscyhFWFBFQ1RFRF9TRVJWRVJfVVJMMywgY2hlY2tvdXRVUkxzLmdldCgwKSk7CisJCWFzc2VydEVxdWFscyhFWFBFQ1RFRF9TRVJWRVJfVVJMMywgY2hlY2tvdXRVUkxzLmdldCgxKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzR2l0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzR2l0VGVzdC5qYXZhCmluZGV4IDg5NjQzMTAuLjNlODNjOGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc0dpdFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNHaXRUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDIxLCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDIxLCAyMDIyIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC02OCw2ICs2OCwyNyBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJyYW5jaFN3aXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiYWJyYW5jaCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYWJyYW5jaCIpLmNhbGwoKTsKKwkJRmlsZSBhRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJhLmJpbiIsICJhYWEiKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImEuYmluIGZpbHRlcj1sZnMiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWNvbW1pdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiYmJyYW5jaCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYmJyYW5jaCIpLmNhbGwoKTsKKwkJRmlsZSBiRmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJiLmJpbiIsICJiYmIiKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImIuYmluIGZpbHRlcj1sZnMiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYmNvbW1pdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYWJyYW5jaCIpLmNhbGwoKTsKKwkJY2hlY2tGaWxlKGFGaWxlLCAiYWFhIik7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJicmFuY2giKS5jYWxsKCk7CisJCWNoZWNrRmlsZShiRmlsZSwgImJiYiIpOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgY2hlY2tvdXROb25MZnNQb2ludGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBjb250ZW50ID0gInNpemVfdFxuc29tZV9mdW5jdGlvbih2b2lkKiBwdHIpO1xuIjsKIAkJRmlsZSBzbWFsbEZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiVGVzdC50eHQiLCBjb250ZW50KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc0Nvbm5lY3Rpb25GYWN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkY2I3ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc0Nvbm5lY3Rpb25GYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIE5haWwgU2FtYXRvdiA8c2FuYWlsQHlhbmRleC5ydT4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5SZW1vdGVBZGRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMuQ2xlYW5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMuUHJvdG9jb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5sZnMuU211ZGdlRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU3RvcmVkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLkh0dHBDb25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIExmc0Nvbm5lY3Rpb25GYWN0b3J5VGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU01VREdFX05BTUUgPSBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQlVJTFRJTl9GSUxURVJfUFJFRklYCisJCQkrIENvbnN0YW50cy5BVFRSX0ZJTFRFUl9EUklWRVJfUFJFRklYCisJCQkrIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5BVFRSX0ZJTFRFUl9UWVBFX1NNVURHRTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTl9OQU1FID0gb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkJVSUxUSU5fRklMVEVSX1BSRUZJWAorCQkJKyBDb25zdGFudHMuQVRUUl9GSUxURVJfRFJJVkVSX1BSRUZJWAorCQkJKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9DTEVBTjsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMRlNfU0VSVkVSX1VSTDEgPSAiaHR0cHM6Ly9sZnMuc2VydmVyMS90ZXN0L3VyaSI7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTEZTX1NFUlZFUl9VUkwyID0gImh0dHBzOi8vbGZzLnNlcnZlcjIvdGVzdC91cmkiOworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE9SSUdJTl9VUkwgPSAiaHR0cHM6Ly9naXQuc2VydmVyL3Rlc3QvdXJpIjsKKworCXByaXZhdGUgR2l0IGdpdDsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsTGZzKCkgeworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoU01VREdFX05BTUUsIFNtdWRnZUZpbHRlci5GQUNUT1JZKTsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKENMRUFOX05BTUUsIENsZWFuRmlsdGVyLkZBQ1RPUlkpOworCX0KKworCUBBZnRlckNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxmcygpIHsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnVucmVnaXN0ZXIoU01VREdFX05BTUUpOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkudW5yZWdpc3RlcihDTEVBTl9OQU1FKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJZ2l0ID0gbmV3IEdpdChkYik7CisKKwkJLy8gSnVzdCB0byBoYXZlIGEgbm9uIGVtcHR5IHJlcG8KKwkJd3JpdGVUcmFzaEZpbGUoIlRlc3QudHh0IiwgIkhlbGxvIHdvcmxkIGZyb20gdGhlIExGUyBGYWN0b3J5IFRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJUZXN0LnR4dCIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkluaXRpYWwgY29tbWl0IikuY2FsbCgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbGZzVXJsRnJvbVJlbW90ZVVybFdpdGhEb3RHaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYWRkUmVtb3RlVXJsKCJodHRwczovL2xvY2FsaG9zdC9yZXBvLmdpdCIpOworCQljaGVja0xmc1VybCgiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwby5naXQvaW5mby9sZnMiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxmc1VybEZyb21SZW1vdGVVcmxXaXRob3V0RG90R2l0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFkZFJlbW90ZVVybCgiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwbyIpOworCQljaGVja0xmc1VybCgiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwby5naXQvaW5mby9sZnMiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxmc1VybEZyb21Mb2NhbENvbmZpZygpIHRocm93cyBFeGNlcHRpb24geworCQlhZGRSZW1vdGVVcmwoImh0dHBzOi8vbG9jYWxob3N0L3JlcG8iKTsKKworCQlTdG9yZWRDb25maWcgY2ZnID0gKChSZXBvc2l0b3J5KSBkYikuZ2V0Q29uZmlnKCk7CisJCWNmZy5zZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19TRUNUSU9OX0xGUywKKwkJCQludWxsLAorCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCwKKwkJCQkiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwby9sZnMiKTsKKwkJY2ZnLnNhdmUoKTsKKworCQljaGVja0xmc1VybCgiaHR0cHM6Ly9sb2NhbGhvc3QvcmVwby9sZnMiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGxmc1VybEZyb21PcmlnaW5Db25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYWRkUmVtb3RlVXJsKCJodHRwczovL2xvY2FsaG9zdC9yZXBvIik7CisKKwkJU3RvcmVkQ29uZmlnIGNmZyA9ICgoUmVwb3NpdG9yeSkgZGIpLmdldENvbmZpZygpOworCQljZmcuc2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfU0VDVElPTl9MRlMsCisJCQkJb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMLAorCQkJCSJodHRwczovL2xvY2FsaG9zdC9yZXBvL2xmcyIpOworCQljZmcuc2F2ZSgpOworCisJCWNoZWNrTGZzVXJsKCJodHRwczovL2xvY2FsaG9zdC9yZXBvL2xmcyIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbGZzVXJsTm90Q29uZmlndXJlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRUaHJvd3MoTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5jbGFzcywKKwkJCQkoKSAtPiBMZnNDb25uZWN0aW9uRmFjdG9yeS5nZXRMZnNDb25uZWN0aW9uKGRiLAorCQkJCUh0dHBTdXBwb3J0Lk1FVEhPRF9QT1NULCBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9sZnN1cmxfbGZzY29uZmlnRnJvbVdvcmtpbmdEaXIoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlTGZzQ29uZmlnKCk7CisJCWNoZWNrTGZzVXJsKExGU19TRVJWRVJfVVJMMSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0dldExmc0Nvbm5lY3Rpb25fbGZzdXJsX2xmc2NvbmZpZ0Zyb21JbmRleCgpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVMZnNDb25maWcoKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRykuY2FsbCgpOworCQlkZWxldGVUcmFzaEZpbGUoQ29uc3RhbnRzLkRPVF9MRlNfQ09ORklHKTsKKwkJY2hlY2tMZnNVcmwoTEZTX1NFUlZFUl9VUkwxKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9sZnN1cmxfbGZzY29uZmlnRnJvbUhFQUQoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlTGZzQ29uZmlnKCk7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihDb25zdGFudHMuRE9UX0xGU19DT05GSUcpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkNvbW1pdCBMRlMgQ29uZmlnIikuY2FsbCgpOworCisJCS8qCisJCSAqIHJlYWRpbmcgLmxmc2NvbmZpZyBmcm9tIEhFQUQgc2VlbXMgb25seSB0ZXN0YWJsZSB1c2luZyBhIGJhcmUgcmVwbywKKwkJICogc2luY2Ugb3RoZXJ3aXNlIHdvcmtpbmcgdHJlZSBvciBpbmRleCBhcmUgdXNlZAorCQkgKi8KKwkJRmlsZSBkaXJlY3RvcnkgPSBjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0QmFyZVJlcG8iKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGJhcmVSZXBvRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKKwkJCQkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKKwkJCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuc2V0QmFyZSh0cnVlKQorCQkJCS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpKSB7CisKKwkJCWNoZWNrTGZzVXJsKExGU19TRVJWRVJfVVJMMSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9yZW1vdGVfbGZzY29uZmlnRnJvbVdvcmtpbmdEaXIoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFkZFJlbW90ZVVybChPUklHSU5fVVJMKTsKKwkJd3JpdGVMZnNDb25maWcoTEZTX1NFUlZFUl9VUkwxLCAibGZzIiwgREVGQVVMVF9SRU1PVEVfTkFNRSwgInVybCIpOworCQljaGVja0xmc1VybChMRlNfU0VSVkVSX1VSTDEpOworCX0KKworCS8qKgorCSAqIFRlc3QgdGhlIGNvbmZpZyBmaWxlIHByZWNlZGVuY2UuCisJICoKKwkgKiBDaGVja2luZyBvbmx5IHdpdGggdGhlIGxvY2FsIHJlcG9zaXRvcnkgY29uZmlnIGlzIHN1ZmZpY2llbnQgc2luY2UgZnJvbQorCSAqIHRoYXQgcG9pbnQgdGhlICJub3JtYWwiIHByZWNlZGVuY2UgaXMgdXNlZC4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0dldExmc0Nvbm5lY3Rpb25fQ29uZmlnRmlsZVByZWNlZGVuY2VfbGZzY29uZmlnRnJvbVdvcmtpbmdEaXIoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlTGZzQ29uZmlnKCk7CisJCWNoZWNrTGZzVXJsKExGU19TRVJWRVJfVVJMMSk7CisKKwkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19TRUNUSU9OX0xGUywgbnVsbCwKKwkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwsIExGU19TRVJWRVJfVVJMMik7CisJCWNvbmZpZy5zYXZlKCk7CisKKwkJY2hlY2tMZnNVcmwoTEZTX1NFUlZFUl9VUkwyKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9JbnZhbGlkTGZzQ29uZmlnX1dvcmtpbmdEaXIoKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlSW52YWxpZExmc0NvbmZpZygpOworCQlMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uIGFjdHVhbEV4Y2VwdGlvbiA9IGFzc2VydFRocm93cygKKwkJCQlMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisJCQlMZnNDb25uZWN0aW9uRmFjdG9yeS5nZXRMZnNDb25uZWN0aW9uKGRiLCBIdHRwU3VwcG9ydC5NRVRIT0RfUE9TVCwKKwkJCQkJUHJvdG9jb2wuT1BFUkFUSU9OX0RPV05MT0FEKTsKKwkJfSk7CisJCWFzc2VydFRydWUoZ2V0U3RhY2tUcmFjZShhY3R1YWxFeGNlcHRpb24pCisJCQkJLmNvbnRhaW5zKCJJbnZhbGlkIGxpbmUgaW4gY29uZmlnIGZpbGUiKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjaGVja0dldExmc0Nvbm5lY3Rpb25fSW52YWxpZExmc0NvbmZpZ19JbmRleCgpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVJbnZhbGlkTGZzQ29uZmlnKCk7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihDb25zdGFudHMuRE9UX0xGU19DT05GSUcpLmNhbGwoKTsKKwkJZGVsZXRlVHJhc2hGaWxlKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRyk7CisJCUxmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24gYWN0dWFsRXhjZXB0aW9uID0gYXNzZXJ0VGhyb3dzKAorCQkJCUxmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uY2xhc3MsICgpIC0+IHsKKwkJCUxmc0Nvbm5lY3Rpb25GYWN0b3J5LmdldExmc0Nvbm5lY3Rpb24oZGIsIEh0dHBTdXBwb3J0Lk1FVEhPRF9QT1NULAorCQkJCQlQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQpOworCQl9KTsKKwkJYXNzZXJ0VHJ1ZShnZXRTdGFja1RyYWNlKGFjdHVhbEV4Y2VwdGlvbikKKwkJCQkuY29udGFpbnMoIkludmFsaWQgbGluZSBpbiBjb25maWcgZmlsZSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNoZWNrR2V0TGZzQ29ubmVjdGlvbl9JbnZhbGlkTGZzQ29uZmlnX0hFQUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVJbnZhbGlkTGZzQ29uZmlnKCk7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihDb25zdGFudHMuRE9UX0xGU19DT05GSUcpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkNvbW1pdCBMRlMgQ29uZmlnIikuY2FsbCgpOworCisJCS8qCisJCSAqIHJlYWRpbmcgLmxmc2NvbmZpZyBmcm9tIEhFQUQgc2VlbXMgb25seSB0ZXN0YWJsZSB1c2luZyBhIGJhcmUgcmVwbywKKwkJICogc2luY2Ugb3RoZXJ3aXNlIHdvcmtpbmcgdHJlZSBvciBpbmRleCBhcmUgdXNlZAorCQkgKi8KKwkJRmlsZSBkaXJlY3RvcnkgPSBjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0QmFyZVJlcG8iKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGJhcmVSZXBvRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKKwkJCQkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKKwkJCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuc2V0QmFyZSh0cnVlKQorCQkJCS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQlMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uIGFjdHVhbEV4Y2VwdGlvbiA9IGFzc2VydFRocm93cygKKwkJCQkJTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJKCkgLT4geworCQkJCQkJTGZzQ29ubmVjdGlvbkZhY3RvcnkuZ2V0TGZzQ29ubmVjdGlvbihkYiwKKwkJCQkJCQkJSHR0cFN1cHBvcnQuTUVUSE9EX1BPU1QsCisJCQkJCQkJCVByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRCk7CisJCQkJCX0pOworCQkJYXNzZXJ0VHJ1ZShnZXRTdGFja1RyYWNlKGFjdHVhbEV4Y2VwdGlvbikKKwkJCQkJLmNvbnRhaW5zKCJJbnZhbGlkIGxpbmUgaW4gY29uZmlnIGZpbGUiKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkUmVtb3RlVXJsKFN0cmluZyByZW1vdFVybCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlbW90ZUFkZENvbW1hbmQgYWRkID0gZ2l0LnJlbW90ZUFkZCgpOworCQlhZGQuc2V0VXJpKG5ldyBVUklpc2gocmVtb3RVcmwpKTsKKwkJYWRkLnNldE5hbWUob3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUpOworCQlhZGQuY2FsbCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBwcm92aWRlZCBleGNlcHRpb24gYXMgc3RyaW5nCisJICoKKwkgKiBAcGFyYW0gYWN0dWFsRXhjZXB0aW9uCisJICogQHJldHVybiBUaGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIGFzIHN0cmluZworCSAqLworCXByaXZhdGUgU3RyaW5nIGdldFN0YWNrVHJhY2UoRXhjZXB0aW9uIGFjdHVhbEV4Y2VwdGlvbikgeworCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisJCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKKwkJYWN0dWFsRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZShwdyk7CisJCXJldHVybiBzdy50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUxmc0NvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXdyaXRlTGZzQ29uZmlnKExGU19TRVJWRVJfVVJMMSwgImxmcyIsICJ1cmwiKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVMZnNDb25maWcoU3RyaW5nIGxmc1VybCwgU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBuYW1lKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJd3JpdGVMZnNDb25maWcobGZzVXJsLCBzZWN0aW9uLCBudWxsLCBuYW1lKTsKKwl9CisKKwkvKgorCSAqIFdyaXRlIHNpbXBsZSBsZnMgY29uZmlnIHdpdGggc2luZ2xlIGVudHJ5LiBEbyBub3QgdXNlIEZpbGVCYXNlZENvbmZpZyB0bworCSAqIGF2b2lkIGludHJvZHVjaW5nIG5ldyBkZXBlbmRlbmN5IChmb3Igbm93KS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgd3JpdGVMZnNDb25maWcoU3RyaW5nIGxmc1VybCwgU3RyaW5nIHNlY3Rpb24sCisJCQlTdHJpbmcgc3Vic2VjdGlvbiwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZ0J1aWxkZXIgY29uZmlnID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJY29uZmlnLmFwcGVuZCgiWyIpOworCQljb25maWcuYXBwZW5kKHNlY3Rpb24pOworCQlpZiAoc3Vic2VjdGlvbiAhPSBudWxsKSB7CisJCQljb25maWcuYXBwZW5kKCIgXCIiKTsKKwkJCWNvbmZpZy5hcHBlbmQoc3Vic2VjdGlvbik7CisJCQljb25maWcuYXBwZW5kKCJcIiIpOworCQl9CisJCWNvbmZpZy5hcHBlbmQoIl1cbiIpOworCQljb25maWcuYXBwZW5kKCIgICAgIik7CisJCWNvbmZpZy5hcHBlbmQobmFtZSk7CisJCWNvbmZpZy5hcHBlbmQoIiA9ICIpOworCQljb25maWcuYXBwZW5kKGxmc1VybCk7CisJCXdyaXRlVHJhc2hGaWxlKENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRywgY29uZmlnLnRvU3RyaW5nKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUludmFsaWRMZnNDb25maWcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl3cml0ZVRyYXNoRmlsZShDb25zdGFudHMuRE9UX0xGU19DT05GSUcsCisJCQkJIntsZnNdXG4gICAgdXJsID0gIiArIExGU19TRVJWRVJfVVJMMSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrTGZzVXJsKFN0cmluZyBsZnNVcmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUh0dHBDb25uZWN0aW9uIGxmc1NlcnZlckNvbm47CisJCWxmc1NlcnZlckNvbm4gPSBMZnNDb25uZWN0aW9uRmFjdG9yeS5nZXRMZnNDb25uZWN0aW9uKGRiLAorCQkJCUh0dHBTdXBwb3J0Lk1FVEhPRF9QT1NULCBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQpOworCisJCWFzc2VydEVxdWFscyhsZnNVcmwgKyBQcm90b2NvbC5PQkpFQ1RTX0xGU19FTkRQT0lOVCwKKwkJCQlsZnNTZXJ2ZXJDb25uLmdldFVSTCgpLnRvU3RyaW5nKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZmJhNThmOC4uMDlmZmZmYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMzEgKzMsMzMgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iNi4wLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzLG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlciIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249IjYuMC4xIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsO3ZlcnNpb249IjYuMS4xIjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0LG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mcyxvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSI2LjEuMSIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKIEltcG9ydC1QYWNrYWdlOiBjb20uZ29vZ2xlLmdzb247dmVyc2lvbj0iWzIuOC4yLDMuMC4wKSIsCiAgY29tLmdvb2dsZS5nc29uLnN0cmVhbTt2ZXJzaW9uPSJbMi44LjIsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiCisgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IGE3MTViZTYuLjdhMmE0NDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9wb20ueG1sCmluZGV4IGViNTdkYjMuLjk0OWM1NjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQubGZzPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNUZXh0LnByb3BlcnRpZXMKaW5kZXggMGUwMGYxNC4uNjQyYjgzZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzVGV4dC5wcm9wZXJ0aWVzCkBAIC0xLDE5ICsxLDE5IEBACiBjb3JydXB0TG9uZ09iamVjdD1UaGUgY29udGVudCBoYXNoICcnezB9Jycgb2YgdGhlIGxvbmcgb2JqZWN0ICcnezF9JycgZG9lc24nJ3QgbWF0Y2ggaXRzIGlkLCB0aGUgY29ycnVwdCBvYmplY3Qgd2lsbCBiZSBkZWxldGVkLgotaW5jb3JyZWN0TE9OR19PQkpFQ1RfSURfTEVOR1RIPUluY29ycmVjdCBMT05HX09CSkVDVF9JRF9MRU5HVEguCi1pbmNvbnNpc3RlbnRNZWRpYWZpbGVMZW5ndGg9TWVkaWFmaWxlIHswfSBoYXMgdW5leHBlY3RlZCBsZW5ndGg7IGV4cGVjdGVkIHsxfSBidXQgZm91bmQgezJ9LgorZG90TGZzQ29uZmlnUmVhZEZhaWxlZD1SZWFkaW5nIC5sZnNjb25maWcgZmFpbGVkCiBpbmNvbnNpc3RlbnRDb250ZW50TGVuZ3RoPVVuZXhwZWN0ZWQgY29udGVudCBsZW5ndGggcmVwb3J0ZWQgYnkgTEZTIHNlcnZlciAoezB9KSwgZXhwZWN0ZWQgezF9IGJ1dCByZXBvcnRlZCB3YXMgezJ9CitpbmNvbnNpc3RlbnRNZWRpYWZpbGVMZW5ndGg9TWVkaWFmaWxlIHswfSBoYXMgdW5leHBlY3RlZCBsZW5ndGg7IGV4cGVjdGVkIHsxfSBidXQgZm91bmQgezJ9LgoraW5jb3JyZWN0TE9OR19PQkpFQ1RfSURfTEVOR1RIPUluY29ycmVjdCBMT05HX09CSkVDVF9JRF9MRU5HVEguCiBpbnZhbGlkTG9uZ0lkPUludmFsaWQgaWQ6IHswfQogaW52YWxpZExvbmdJZExlbmd0aD1JbnZhbGlkIGlkIGxlbmd0aCB7MH07IHNob3VsZCBiZSB7MX0KLWxmc1VuYXZhaWxhYmxlPUxGUyBpcyBub3QgYXZhaWxhYmxlIGZvciByZXBvc2l0b3J5IHswfQotcHJvdG9jb2xFcnJvcj1MRlMgUHJvdG9jb2wgRXJyb3IgezB9OiB7MX0KLXJlcXVpcmVkSGFzaEZ1bmN0aW9uTm90QXZhaWxhYmxlPVJlcXVpcmVkIGhhc2ggZnVuY3Rpb24gezB9IG5vdCBhdmFpbGFibGUuCi1yZXBvc2l0b3J5Tm90Rm91bmQ9UmVwb3NpdG9yeSB7MH0gbm90IGZvdW5kCi1yZXBvc2l0b3J5UmVhZE9ubHk9UmVwb3NpdG9yeSB7MH0gaXMgcmVhZC1vbmx5Ci1sZnNVbmF2YWlsYWJsZT1MRlMgaXMgbm90IGF2YWlsYWJsZSBmb3IgcmVwb3NpdG9yeSB7MH0KLWxmc1VuYXRob3JpemVkPU5vdCBhdXRob3JpemVkIHRvIHBlcmZvcm0gb3BlcmF0aW9uIHswfSBvbiByZXBvc2l0b3J5IHsxfQogbGZzRmFpbGVkVG9HZXRSZXBvc2l0b3J5PWZhaWxlZCB0byBnZXQgcmVwb3NpdG9yeSB7MH0KIGxmc05vRG93bmxvYWRVcmw9Ik5lZWQgdG8gZG93bmxvYWQgb2JqZWN0IGZyb20gTEZTIHNlcnZlciBidXQgY291bGRuJ3QgZGV0ZXJtaW5lIExGUyBzZXJ2ZXIgVVJMIgorbGZzVW5hdXRob3JpemVkPU5vdCBhdXRob3JpemVkIHRvIHBlcmZvcm0gb3BlcmF0aW9uIHswfSBvbiByZXBvc2l0b3J5IHsxfQorbGZzVW5hdmFpbGFibGU9TEZTIGlzIG5vdCBhdmFpbGFibGUgZm9yIHJlcG9zaXRvcnkgezB9CittaXNzaW5nTG9jYWxPYmplY3Q9IkxvY2FsIE9iamVjdCB7MH0gaXMgbWlzc2luZyIKK3Byb3RvY29sRXJyb3I9TEZTIFByb3RvY29sIEVycm9yIHswfTogezF9CityZXBvc2l0b3J5Tm90Rm91bmQ9UmVwb3NpdG9yeSB7MH0gbm90IGZvdW5kCityZXBvc2l0b3J5UmVhZE9ubHk9UmVwb3NpdG9yeSB7MH0gaXMgcmVhZC1vbmx5CityZXF1aXJlZEhhc2hGdW5jdGlvbk5vdEF2YWlsYWJsZT1SZXF1aXJlZCBoYXNoIGZ1bmN0aW9uIHswfSBub3QgYXZhaWxhYmxlLgogc2VydmVyRmFpbHVyZT1XaGVuIHRyeWluZyB0byBvcGVuIGEgY29ubmVjdGlvbiB0byB7MH0gdGhlIHNlcnZlciByZXNwb25kZWQgd2l0aCBhbiBlcnJvciBjb2RlLiByYz17MX0KLXdyb25nQW1vdXRPZkRhdGFSZWNlaXZlZD1XaGlsZSBkb3dubG9hZGluZyBkYXRhIGZyb20gdGhlIGNvbnRlbnQgc2VydmVyIHswfSB7MX0gYnl0ZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdoaWxlIHsyfSBoYXZlIGJlZW4gZXhwZWN0ZWQKIHVzZXJDb25maWdJbnZhbGlkPSJVc2VyIGNvbmZpZyBmaWxlIHswfSBpbnZhbGlkIHsxfSIKLW1pc3NpbmdMb2NhbE9iamVjdD0iTG9jYWwgT2JqZWN0IHswfSBpcyBtaXNzaW5nIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK3dyb25nQW1vdW50T2ZEYXRhUmVjZWl2ZWQ9V2hpbGUgZG93bmxvYWRpbmcgZGF0YSBmcm9tIHRoZSBjb250ZW50IHNlcnZlciB7MH0gezF9IGJ5dGVzIGhhdmUgYmVlbiByZWNlaXZlZCB3aGlsZSB7Mn0gaGF2ZSBiZWVuIGV4cGVjdGVkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1ByZVB1c2hIb29rLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQppbmRleCBkNmNlODU1Li5lYmY0NmUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQpAQCAtMTEzLDYgKzExMyw5IEBAIHByaXZhdGUgU2V0PExmc1BvaW50ZXI+IGZpbmRPYmplY3RzVG9QdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uLAogCiAJCXRyeSAoT2JqZWN0V2FsayB3YWxrID0gbmV3IE9iamVjdFdhbGsoZ2V0UmVwb3NpdG9yeSgpKSkgewogCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdXAgOiByZWZzKSB7CisJCQkJaWYgKHVwLmlzRGVsZXRlKCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQogCQkJCXdhbGsuc2V0UmV3cml0ZVBhcmVudHMoZmFsc2UpOwogCQkJCWV4Y2x1ZGVSZW1vdGVSZWZzKHdhbGspOwogCQkJCXdhbGsubWFya1N0YXJ0KHdhbGsucGFyc2VDb21taXQodXAuZ2V0TmV3T2JqZWN0SWQoKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhCmluZGV4IDM0MTE4ODcuLmMyNmExYmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9TbXVkZ2VGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEKQEAgLTIwNSw3ICsyMDUsNyBAQCBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UGF0aD4gZG93bmxvYWRMZnNSZXNvdXJjZShMZnMgbGZzLCBSZXBvc2l0b3J5IGRiLAogCQkJCQlsb25nIGJ5dGVzQ29waWVkID0gRmlsZXMuY29weShjb250ZW50SW4sIHBhdGgpOwogCQkJCQlpZiAoYnl0ZXNDb3BpZWQgIT0gby5zaXplKSB7CiAJCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJCUxmc1RleHQuZ2V0KCkud3JvbmdBbW91dE9mRGF0YVJlY2VpdmVkLAorCQkJCQkJCQlMZnNUZXh0LmdldCgpLndyb25nQW1vdW50T2ZEYXRhUmVjZWl2ZWQsCiAJCQkJCQkJCWNvbnRlbnRTZXJ2ZXJDb25uLmdldFVSTCgpLAogCQkJCQkJCQlMb25nLnZhbHVlT2YoYnl0ZXNDb3BpZWQpLAogCQkJCQkJCQlMb25nLnZhbHVlT2Yoby5zaXplKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2Vycm9ycy9MZnNVbmF1dGhvcml6ZWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9lcnJvcnMvTGZzVW5hdXRob3JpemVkLmphdmEKaW5kZXggMzY4ODlkYi4uMGRjNmFlYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2Vycm9ycy9MZnNVbmF1dGhvcml6ZWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc1VuYXV0aG9yaXplZC5qYXZhCkBAIC0zMSw3ICszMSw3IEBAIHB1YmxpYyBjbGFzcyBMZnNVbmF1dGhvcml6ZWQgZXh0ZW5kcyBMZnNFeGNlcHRpb24gewogCSAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgbmFtZS4KIAkgKi8KIAlwdWJsaWMgTGZzVW5hdXRob3JpemVkKFN0cmluZyBvcGVyYXRpb24sIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KExmc1RleHQuZ2V0KCkubGZzVW5hdGhvcml6ZWQsIG9wZXJhdGlvbiwKKwkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoTGZzVGV4dC5nZXQoKS5sZnNVbmF1dGhvcml6ZWQsIG9wZXJhdGlvbiwKIAkJCQluYW1lKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc0NvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc0NvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZDM5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29uZmlnLmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIE1hdHRoaWFzIEZyb21tZSA8bWZyb21tZUBkc3BhY2UuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkJsb2JCYXNlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZUcmVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5IRUFEOworCisvKioKKyAqIEVuY2Fwc3VsYXRlIGFjY2VzcyB0byB0aGUgLmxmc2NvbmZpZy4KKyAqCisgKiBBY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50CisgKiBodHRwczovL2dpdGh1Yi5jb20vZ2l0LWxmcy9naXQtbGZzL2Jsb2IvbWFpbi9kb2NzL21hbi9naXQtbGZzLWNvbmZpZy41LnJvbm4KKyAqIHRoZSBvcmRlciB0byBmaW5kIHRoZSAubGZzY29uZmlnIGZpbGUgaXM6CisgKgorICogPHByZT4KKyAqICAgMS4gaW4gdGhlIHJvb3Qgb2YgdGhlIHdvcmtpbmcgdHJlZQorICogICAyLiBpbiB0aGUgaW5kZXgKKyAqICAgMy4gaW4gdGhlIEhFQUQsIGZvciBiYXJlIHJlcG9zaXRvcmllcyB0aGlzIGlzIHRoZSBvbmx5IHBsYWNlCisgKiAgICAgIHRoYXQgaXMgc2VhcmNoZWQKKyAqIDwvcHJlPgorICoKKyAqIFZhbHVlcyBmcm9tIHRoZSAubGZzY29uZmlnIGFyZSB1c2VkIG9ubHkgaWYgbm90IHNwZWNpZmllZCBpbiBhbm90aGVyIGdpdAorICogY29uZmlnIGZpbGUgdG8gYWxsb3cgbG9jYWwgb3ZlcnJpZGUgd2l0aG91dCBtb2RpZmljdGlvbiBvZiBhIGNvbW1pdHRlZCBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgTGZzQ29uZmlnIHsKKwlwcml2YXRlIFJlcG9zaXRvcnkgZGI7CisJcHJpdmF0ZSBDb25maWcgZGVsZWdhdGU7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIExmc0NvbmZpZy4KKwkgKgorCSAqIEBwYXJhbSBkYgorCSAqICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgcmVwbworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgTGZzQ29uZmlnKFJlcG9zaXRvcnkgZGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRoaXMuZGIgPSBkYjsKKwkJZGVsZWdhdGUgPSB0aGlzLmxvYWQoKTsKKwl9CisKKwkvKioKKwkgKiBSZWFkIHRoZSAubGZzY29uZmlnIGZpbGUgZnJvbSB0aGUgcmVwb3NpdG9yeQorCSAqCisJICogQHJldHVybiBUaGUgbG9hZGVkIGxmcyBjb25maWcgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdAorCSAqCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgQ29uZmlnIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb25maWcgcmVzdWx0ID0gbnVsbDsKKworCQlpZiAoIWRiLmlzQmFyZSgpKSB7CisJCQlyZXN1bHQgPSBsb2FkRnJvbVdvcmtpbmdUcmVlKCk7CisJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCQlyZXN1bHQgPSBsb2FkRnJvbUluZGV4KCk7CisJCQl9CisJCX0KKworCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCXJlc3VsdCA9IGxvYWRGcm9tSGVhZCgpOworCQl9CisKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQlyZXN1bHQgPSBlbXB0eUNvbmZpZygpOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBUcnkgdG8gcmVhZCB0aGUgbGZzIGNvbmZpZyBmcm9tIGEgZmlsZSBjYWxsZWQgLmxmc2NvbmZpZyBhdCB0aGUgdG9wIGxldmVsCisJICogb2YgdGhlIHdvcmtpbmcgdHJlZS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGNvbmZpZywgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJQE51bGxhYmxlCisJcHJpdmF0ZSBDb25maWcgbG9hZEZyb21Xb3JraW5nVHJlZSgpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlGaWxlIGxmc0NvbmZpZyA9IGRiLmdldEZTKCkucmVzb2x2ZShkYi5nZXRXb3JrVHJlZSgpLAorCQkJCUNvbnN0YW50cy5ET1RfTEZTX0NPTkZJRyk7CisJCWlmIChsZnNDb25maWcuZXhpc3RzKCkgJiYgbGZzQ29uZmlnLmlzRmlsZSgpKSB7CisJCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gbmV3IEZpbGVCYXNlZENvbmZpZyhsZnNDb25maWcsIGRiLmdldEZTKCkpOworCQkJdHJ5IHsKKwkJCQljb25maWcubG9hZCgpOworCQkJCXJldHVybiBjb25maWc7CisJCQl9IGNhdGNoIChDb25maWdJbnZhbGlkRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbigKKwkJCQkJCUxmc1RleHQuZ2V0KCkuZG90TGZzQ29uZmlnUmVhZEZhaWxlZCwgZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVHJ5IHRvIHJlYWQgdGhlIGxmcyBjb25maWcgZnJvbSBhbiBlbnRyeSBjYWxsZWQgLmxmc2NvbmZpZyBjb250YWluZWQgaW4KKwkgKiB0aGUgaW5kZXguCisJICoKKwkgKiBAcmV0dXJuIHRoZSBjb25maWcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlATnVsbGFibGUKKwlwcml2YXRlIENvbmZpZyBsb2FkRnJvbUluZGV4KCkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlEaXJDYWNoZUVudHJ5IGVudHJ5ID0gZGIucmVhZERpckNhY2hlKCkKKwkJCQkJLmdldEVudHJ5KENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRyk7CisJCQlpZiAoZW50cnkgIT0gbnVsbCkgeworCQkJCXJldHVybiBuZXcgQmxvYkJhc2VkQ29uZmlnKG51bGwsIGRiLCBlbnRyeS5nZXRPYmplY3RJZCgpKTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgTGZzQ29uZmlnSW52YWxpZEV4Y2VwdGlvbigKKwkJCQkJTGZzVGV4dC5nZXQoKS5kb3RMZnNDb25maWdSZWFkRmFpbGVkLCBlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUcnkgdG8gcmVhZCB0aGUgbGZzIGNvbmZpZyBmcm9tIGFuIGVudHJ5IGNhbGxlZCAubGZzY29uZmlnIGNvbnRhaW5lZCBpbgorCSAqIHRoZSBoZWFkIHJldmlzaW9uLgorCSAqCisJICogQHJldHVybiB0aGUgY29uZmlnLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlATnVsbGFibGUKKwlwcml2YXRlIENvbmZpZyBsb2FkRnJvbUhlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgKFJldldhbGsgcmV2V2FsayA9IG5ldyBSZXZXYWxrKGRiKSkgeworCQkJT2JqZWN0SWQgaGVhZENvbW1pdElkID0gZGIucmVzb2x2ZShIRUFEKTsKKwkJCWlmIChoZWFkQ29tbWl0SWQgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJUmV2Q29tbWl0IGNvbW1pdCA9IHJldldhbGsucGFyc2VDb21taXQoaGVhZENvbW1pdElkKTsKKwkJCVJldlRyZWUgdHJlZSA9IGNvbW1pdC5nZXRUcmVlKCk7CisJCQlUcmVlV2FsayB0cmVld2FsayA9IFRyZWVXYWxrLmZvclBhdGgoZGIsIENvbnN0YW50cy5ET1RfTEZTX0NPTkZJRywKKwkJCQkJdHJlZSk7CisJCQlpZiAodHJlZXdhbGsgIT0gbnVsbCkgeworCQkJCXJldHVybiBuZXcgQmxvYkJhc2VkQ29uZmlnKG51bGwsIGRiLCB0cmVld2Fsay5nZXRPYmplY3RJZCgwKSk7CisJCQl9CisJCX0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24oCisJCQkJCUxmc1RleHQuZ2V0KCkuZG90TGZzQ29uZmlnUmVhZEZhaWxlZCwgZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlIGFuIGVtcHR5IGNvbmZpZyBhcyBmYWxsYmFjayB0byBhdm9pZCBudWxsIHBvaW50ZXIgY2hlY2tzLgorCSAqCisJICogQHJldHVybiBhbiBlbXB0eSBjb25maWcKKwkgKi8KKwlwcml2YXRlIENvbmZpZyBlbXB0eUNvbmZpZygpIHsKKwkJcmV0dXJuIG5ldyBDb25maWcoKTsKKwl9CisKKwkvKioKKwkgKiBHZXQgc3RyaW5nIHZhbHVlIG9yIG51bGwgaWYgbm90IGZvdW5kLgorCSAqCisJICogRmlyc3QgdHJpZXMgdG8gZmluZCB0aGUgdmFsdWUgaW4gdGhlIGdpdCBjb25maWcgZmlsZXMuIElmIG5vdCBmb3VuZCB0cmllcworCSAqIHRvIGZpbmQgZGF0YSBpbiAubGZzY29uZmlnLgorCSAqCisJICogQHBhcmFtIHNlY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSBzZWN0aW9uCisJICogQHBhcmFtIHN1YnNlY3Rpb24KKwkgKiAgICAgICAgICAgIHRoZSBzdWJzZWN0aW9uIGZvciB0aGUgdmFsdWUKKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgdGhlIGtleSBuYW1lCisJICogQHJldHVybiBhIFN0cmluZyB2YWx1ZSBmcm9tIHRoZSBjb25maWcsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGZpbmFsIFN0cmluZyBzZWN0aW9uLCBmaW5hbCBTdHJpbmcgc3Vic2VjdGlvbiwKKwkJCWZpbmFsIFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyByZXN1bHQgPSBkYi5nZXRDb25maWcoKS5nZXRTdHJpbmcoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gZGVsZWdhdGUuZ2V0U3RyaW5nKHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc0Nvbm5lY3Rpb25GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YQppbmRleCBlMjIxOTEzLi4xMmI2ODhkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcsIE1hcmt1cyBEdWZ0IDxtYXJrdXMuZHVmdEBzc2ktc2NoYWVmZXIuY29tPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcsIDIwMjIgTWFya3VzIER1ZnQgPG1hcmt1cy5kdWZ0QHNzaS1zY2hhZWZlci5jb20+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTM5LDEyICszOSwxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuSHR0cENvbm5lY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5Tc2hTdXBwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TdHJpbmdVdGlsczsKIAogLyoqCiAgKiBQcm92aWRlcyBtZWFucyB0byBnZXQgYSB2YWxpZCBMRlMgY29ubmVjdGlvbiBmb3IgYSBnaXZlbiByZXBvc2l0b3J5LgogICovCiBwdWJsaWMgY2xhc3MgTGZzQ29ubmVjdGlvbkZhY3RvcnkgewotCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNTSF9BVVRIX1RJTUVPVVRfU0VDT05EUyA9IDMwOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUVfSFRUUFMgPSAiaHR0cHMiOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9TU0ggPSAic3NoIjsgLy8kTk9OLU5MUy0xJApAQCAtNjQsNyArNjQsNyBAQCBwdWJsaWMgY2xhc3MgTGZzQ29ubmVjdGlvbkZhY3RvcnkgewogCSAqICAgICAgICAgICAgYmUgdXNlZCBmb3IKIAkgKiBAcGFyYW0gcHVycG9zZQogCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiwgZS5nLiBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQKLQkgKiBAcmV0dXJuIHRoZSB1cmwgZm9yIHRoZSBsZnMgc2VydmVyLiBlLmcuCisJICogQHJldHVybiB0aGUgY29ubmVjdGlvbiBmb3IgdGhlIGxmcyBzZXJ2ZXIuIGUuZy4KIAkgKiAgICAgICAgICJodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViL2dpdC1sZnMuZ2l0L2luZm8vbGZzIgogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKi8KQEAgLTkyLDEzICs5MiwzMCBAQCBwdWJsaWMgc3RhdGljIEh0dHBDb25uZWN0aW9uIGdldExmc0Nvbm5lY3Rpb24oUmVwb3NpdG9yeSBkYiwgU3RyaW5nIG1ldGhvZCwKIAkJcmV0dXJuIGNvbm5lY3Rpb247CiAJfQogCisJLyoqCisJICogR2V0IExGUyBTZXJ2ZXIgVVJMLgorCSAqCisJICogQHBhcmFtIGRiCisJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSB0byB3b3JrIHdpdGgKKwkgKiBAcGFyYW0gcHVycG9zZQorCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiwgZS5nLiBQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQKKwkgKiBAcGFyYW0gYWRkaXRpb25hbEhlYWRlcnMKKwkgKiAgICAgICAgICAgIGFkZGl0aW9uYWwgaGVhZGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbm5lY3QgdG8gTEZTIHNlcnZlcgorCSAqIEByZXR1cm4gdGhlIFVSTCBmb3IgdGhlIExGUyBzZXJ2ZXIuIGUuZy4KKwkgKiAgICAgICAgICJodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViL2dpdC1sZnMuZ2l0L2luZm8vbGZzIgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgTEZTIGNvbmZpZyBpcyBpbnZhbGlkIG9yIGNhbm5vdCBiZSBhY2Nlc3NlZAorCSAqIEBzZWUgPGEgaHJlZj0KKwkgKiAgICAgICJodHRwczovL2dpdGh1Yi5jb20vZ2l0LWxmcy9naXQtbGZzL2Jsb2IvbWFpbi9kb2NzL2FwaS9zZXJ2ZXItZGlzY292ZXJ5Lm1kIj4KKwkgKiAgICAgIFNlcnZlciBEaXNjb3ZlcnkgZG9jdW1lbnRhdGlvbjwvYT4KKwkgKi8KIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGZzVXJsKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBwdXJwb3NlLAogCQkJTWFwPFN0cmluZywgU3RyaW5nPiBhZGRpdGlvbmFsSGVhZGVycykKLQkJCXRocm93cyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKLQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTGZzQ29uZmlnIGNvbmZpZyA9IG5ldyBMZnNDb25maWcoZGIpOwogCQlTdHJpbmcgbGZzVXJsID0gY29uZmlnLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1NFQ1RJT05fTEZTLAotCQkJCW51bGwsCi0JCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKTsKKwkJCQludWxsLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpOworCiAJCUV4Y2VwdGlvbiBleCA9IG51bGw7CiAJCWlmIChsZnNVcmwgPT0gbnVsbCkgewogCQkJU3RyaW5nIHJlbW90ZVVybCA9IG51bGw7CkBAIC0xMDYsNiArMTIzLDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExmc1VybChSZXBvc2l0b3J5IGRiLCBTdHJpbmcgcHVycG9zZSwKIAkJCQlsZnNVcmwgPSBjb25maWcuZ2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfU0VDVElPTl9MRlMsCiAJCQkJCQlyZW1vdGUsCiAJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpOworCiAJCQkJLy8gVGhpcyBjb3VsZCBiZSBkb25lIGJldHRlciAobW9yZSBwcmVjaXNlIGxvZ2ljKSwgYnV0IGFjY29yZGluZwogCQkJCS8vIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9naXQtbGZzL2dpdC1sZnMvaXNzdWVzLzE3NTkgZ2l0LWxmcwogCQkJCS8vIGdlbmVyYWxseSBvbmx5IHN1cHBvcnRzICdvcmlnaW4nIGluIGFuIGludGVncmF0ZWQgd29ya2Zsb3cuCkBAIC0xMjUsOCArMTQzLDYgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExmc1VybChSZXBvc2l0b3J5IGRiLCBTdHJpbmcgcHVycG9zZSwKIAkJCQkJCXwgQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbiBlKSB7CiAJCQkJCWV4ID0gZTsKIAkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxmc1VybCA9IGxmc1VybCArIFByb3RvY29sLklORk9fTEZTX0VORFBPSU5UOwogCQkJfQogCQl9CiAJCWlmIChsZnNVcmwgPT0gbnVsbCkgewpAQCAtMTQ5LDcgKzE2NSw4IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyBkaXNjb3Zlckxmc1VybChSZXBvc2l0b3J5IGRiLCBTdHJpbmcgcHVycG9zZSwKIAkJCWFkZGl0aW9uYWxIZWFkZXJzLnB1dEFsbChhY3Rpb24uaGVhZGVyKTsKIAkJCXJldHVybiBhY3Rpb24uaHJlZjsKIAkJfQotCQlyZXR1cm4gcmVtb3RlVXJsICsgUHJvdG9jb2wuSU5GT19MRlNfRU5EUE9JTlQ7CisJCXJldHVybiBTdHJpbmdVdGlscy5uYW1lV2l0aERvdEdpdChyZW1vdGVVcmwpCisJCQkJKyBQcm90b2NvbC5JTkZPX0xGU19FTkRQT0lOVDsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBQcm90b2NvbC5FeHBpcmluZ0FjdGlvbiBnZXRTc2hBdXRoZW50aWNhdGlvbigKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzVGV4dC5qYXZhCmluZGV4IDFjYTM3YTkuLjA2MjM0YzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNUZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2ludGVybmFsL0xmc1RleHQuamF2YQpAQCAtMjgsMjEgKzI4LDIyIEBAIHB1YmxpYyBzdGF0aWMgTGZzVGV4dCBnZXQoKSB7CiAKIAkvLyBAZm9ybWF0dGVyOm9mZgogCS8qKiovIHB1YmxpYyBTdHJpbmcgY29ycnVwdExvbmdPYmplY3Q7Ci0JLyoqKi8gcHVibGljIFN0cmluZyBpbmNvbnNpc3RlbnRNZWRpYWZpbGVMZW5ndGg7CisJLyoqKi8gcHVibGljIFN0cmluZyBkb3RMZnNDb25maWdSZWFkRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW5jb25zaXN0ZW50Q29udGVudExlbmd0aDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGluY29uc2lzdGVudE1lZGlhZmlsZUxlbmd0aDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGluY29ycmVjdExPTkdfT0JKRUNUX0lEX0xFTkdUSDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRMb25nSWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkTG9uZ0lkTGVuZ3RoOwotCS8qKiovIHB1YmxpYyBTdHJpbmcgbGZzVW5hdmFpbGFibGU7Ci0JLyoqKi8gcHVibGljIFN0cmluZyBwcm90b2NvbEVycm9yOwotCS8qKiovIHB1YmxpYyBTdHJpbmcgcmVxdWlyZWRIYXNoRnVuY3Rpb25Ob3RBdmFpbGFibGU7Ci0JLyoqKi8gcHVibGljIFN0cmluZyByZXBvc2l0b3J5Tm90Rm91bmQ7Ci0JLyoqKi8gcHVibGljIFN0cmluZyByZXBvc2l0b3J5UmVhZE9ubHk7Ci0JLyoqKi8gcHVibGljIFN0cmluZyBsZnNVbmF0aG9yaXplZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGxmc0ZhaWxlZFRvR2V0UmVwb3NpdG9yeTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGxmc05vRG93bmxvYWRVcmw7Ci0JLyoqKi8gcHVibGljIFN0cmluZyBzZXJ2ZXJGYWlsdXJlOwotCS8qKiovIHB1YmxpYyBTdHJpbmcgd3JvbmdBbW91dE9mRGF0YVJlY2VpdmVkOwotCS8qKiovIHB1YmxpYyBTdHJpbmcgdXNlckNvbmZpZ0ludmFsaWQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBsZnNVbmF1dGhvcml6ZWQ7CisJLyoqKi8gcHVibGljIFN0cmluZyBsZnNVbmF2YWlsYWJsZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1pc3NpbmdMb2NhbE9iamVjdDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHByb3RvY29sRXJyb3I7CisJLyoqKi8gcHVibGljIFN0cmluZyByZXBvc2l0b3J5Tm90Rm91bmQ7CisJLyoqKi8gcHVibGljIFN0cmluZyByZXBvc2l0b3J5UmVhZE9ubHk7CisJLyoqKi8gcHVibGljIFN0cmluZyByZXF1aXJlZEhhc2hGdW5jdGlvbk5vdEF2YWlsYWJsZTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHNlcnZlckZhaWx1cmU7CisJLyoqKi8gcHVibGljIFN0cmluZyB1c2VyQ29uZmlnSW52YWxpZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHdyb25nQW1vdW50T2ZEYXRhUmVjZWl2ZWQ7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9Db25zdGFudHMuamF2YQppbmRleCAzMjEyYTYzLi45YjQxZWMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0NvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQ29uc3RhbnRzLmphdmEKQEAgLTgyLDYgKzgyLDEzIEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRklMVEVSX0RSSVZFUl9QUkVGSVggPSAibGZzLyI7CiAKIAkvKioKKwkgKiBDb25maWcgZmlsZSBuYW1lIGZvciBsZnMgc3BlY2lmaWMgY29uZmlndXJhdGlvbgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9MRlNfQ09ORklHID0gIi5sZnNjb25maWciOworCisJLyoqCiAJICogQ3JlYXRlIGEgbmV3IGRpZ2VzdCBmdW5jdGlvbiBmb3Igb2JqZWN0cy4KIAkgKgogCSAqIEByZXR1cm4gYSBuZXcgZGlnZXN0IG9iamVjdC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBjYzFiZjg1Li5jZDIyZTI0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0IgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjYuMC4xLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjYuMS4xLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwKaW5kZXggODc0YjI3NC4uNTRmZWI5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBiZTAyNjYyLi4yMDYxOTQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjYuMC4xLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjYuMS4xLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KQEAgLTIzLDcgKzIzLDcgQEAKICAgIDwvdXJsPgogCiAgICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4wLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy5mZWF0dXJlL3BvbS54bWwKaW5kZXggMjkwOWU4MC4uNzYwOTAzZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5ncGcuYmMuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLmZlYXR1cmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCA4OTM3YTgzLi5lODk5YWQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjYuMC4xLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjYuMS4xLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KQEAgLTIzLDcgKzIzLDcgQEAKICAgIDwvdXJsPgogCiAgICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4wLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCmluZGV4IDIyOTJjMmUuLmI3MjVkZmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDZlZWU3Y2QuLjk5MDczZTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpAQCAtMjQsNyArMjQsNyBAQAogCiAgICA8cmVxdWlyZXM+CiAgICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmpjcmFmdC5qc2NoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4wLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sCmluZGV4IGRjNDE1OWIuLjM1NjZkYmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggZjBhNDg4NC4uYzA0MDUxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LmxmcyIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CkBAIC0yMyw3ICsyMyw3IEBACiAgICA8L3VybD4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjAuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL3BvbS54bWwKaW5kZXggZTM0NGMxOS4uNTAzMzhhNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IGY1ODg5ZTUuLjM5MzlmNTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5wZ20iCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpAQCAtMzUsOSArMzUsOSBAQAogICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjAuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdC5sZnMiIHZlcnNpb249IjYuMC4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUiIHZlcnNpb249IjYuMC4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjEuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdC5sZnMiIHZlcnNpb249IjYuMS4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUiIHZlcnNpb249IjYuMS4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgogICAgPC9yZXF1aXJlcz4KIAogICAgPHBsdWdpbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9wb20ueG1sCmluZGV4IGFlOTU3MDQuLjRiMGUyNmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnJlcG9zaXRvcnkvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sCmluZGV4IGUxMmU1OTkuLjljY2YzOWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sCkBAIC0xNyw3ICsxNyw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggZDVkMTU1NC4uZDNlNjYyYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CkBAIC0yMyw3ICsyMyw3IEBACiAgICA8L3VybD4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjAuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKaW5kZXggYTIwNjQ1ZS4uZDhiNWRlMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KQEAgLTMwLDcgKzMwLDcgQEAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggYWU2MmZhMC4uZTAzOTY0NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CkBAIC0yMyw3ICsyMyw3IEBACiAgICA8L3VybD4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI2LjAuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamdpdCIgdmVyc2lvbj0iNi4xLjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmZlYXR1cmUvcG9tLnhtbAppbmRleCA2ZjEyYWZhLi41OTFiNDQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggZGY0MmU5My4uM2RmNGE5MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2guZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdC5zc2guanNjaCIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CkBAIC0yMyw3ICsyMyw3IEBACiAgICA8L3VybD4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjYuMC4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjYuMS4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgogICAgPC9yZXF1aXJlcz4KIAogICAgPHBsdWdpbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvcG9tLnhtbAppbmRleCAzN2FkYTVkLi5lNDYxYmZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLmZlYXR1cmUvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZDMxY2QzNy4uNWQ2MWVlZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTIsNCArMiw0IEBACiBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCiBCdW5kbGUtTmFtZTogSkdpdCBUYXJnZXQgUGxhdGZvcm0gQnVuZGxlCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnRhcmdldAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIxLnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMS50YXJnZXQKaW5kZXggMDdhZGVkOC4uZWRjMTZjZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIxLnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjEudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWNiaS90YXJnZXRwbGF0Zm9ybS1kc2wgLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC4yMSIgc2VxdWVuY2VOdW1iZXI9IjE3NTMwOTc0MTciPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuMjEiIHNlcXVlbmNlTnVtYmVyPSIxNzUzMTAzOTUxIj4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJqYWthcnRhLnNlcnZsZXQtYXBpIiB2ZXJzaW9uPSI0LjAuMCIvPgpAQCAtMjMsOCArMjMsOCBAQAogICAgICAgPHJlcG9zaXRvcnkgaWQ9ImpldHR5LTEwLjAueCIgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS9qZXR0eS8xMC4wLjYvIi8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2giIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaC5zb3VyY2UiIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIiIHZlcnNpb249IjEuMS4xLnYyMDEyMDUxMDIzMDUiLz4KQEAgLTUxLDIyICs1MSwyMiBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjAudjIwMTgwNDA5LTE1MDIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudC5zb3VyY2UiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0ai5zb3VyY2UiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LnNvdXJjZSIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5zaW1wbGUuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54eiIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54ei5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+Ci0gICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjExMjEzMTczODEzL3JlcG9zaXRvcnkiLz4KKyAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMjAzMDIxNzIyMzMvcmVwb3NpdG9yeSIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2Uub3NnaSIgdmVyc2lvbj0iMC4wLjAiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMS50cGQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjEudHBkCmluZGV4IDExOWM4MGUuLjQzY2E1ZjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMS50cGQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIxLnRwZApAQCAtMSw3ICsxLDcgQEAKIHRhcmdldCAiamdpdC00LjIxIiB3aXRoIHNvdXJjZSBjb25maWd1cmVQaGFzZQogCiBpbmNsdWRlICJwcm9qZWN0cy9qZXR0eS0xMC4wLngudHBkIgotaW5jbHVkZSAib3JiaXQvUjIwMjExMjEzMTczODEzLTIwMjEtMTIudHBkIgoraW5jbHVkZSAib3JiaXQvUjIwMjIwMzAyMTcyMjMzLTIwMjItMDMudHBkIgogCiBsb2NhdGlvbiAiaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9yZWxlYXNlcy8yMDIxLTEyLyIgewogCW9yZy5lY2xpcHNlLm9zZ2kgbGF6eQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIyLnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMi50YXJnZXQKaW5kZXggOTdiNWZiNi4uYjIyOWRhMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIyLnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjIudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWNiaS90YXJnZXRwbGF0Zm9ybS1kc2wgLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC4yMiIgc2VxdWVuY2VOdW1iZXI9IjE2NDEzOTQxNzciPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuMjIiIHNlcXVlbmNlTnVtYmVyPSIxNjQ2MjU2NjUzIj4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJqYWthcnRhLnNlcnZsZXQtYXBpIiB2ZXJzaW9uPSI0LjAuMCIvPgpAQCAtMjMsOCArMjMsOCBAQAogICAgICAgPHJlcG9zaXRvcnkgaWQ9ImpldHR5LTEwLjAueCIgbG9jYXRpb249Imh0dHBzOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvZWNsaXBzZS9qZXR0eS8xMC4wLjYvIi8+CiAgICAgPC9sb2NhdGlvbj4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KLSAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC44LnYyMDIxMTAyOS0wODM4Ii8+Ci0gICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjgudjIwMjExMDI5LTA4MzgiLz4KKyAgICAgIDx1bml0IGlkPSJjb20uZ29vZ2xlLmdzb24iIHZlcnNpb249IjIuOC45LnYyMDIyMDExMS0xNDA5Ii8+CisgICAgICA8dW5pdCBpZD0iY29tLmdvb2dsZS5nc29uLnNvdXJjZSIgdmVyc2lvbj0iMi44LjkudjIwMjIwMTExLTE0MDkiLz4KICAgICAgIDx1bml0IGlkPSJjb20uamNyYWZ0LmpzY2giIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanNjaC5zb3VyY2UiIHZlcnNpb249IjAuMS41NS52MjAxOTA0MDQtMTkwMiIvPgogICAgICAgPHVuaXQgaWQ9ImNvbS5qY3JhZnQuanpsaWIiIHZlcnNpb249IjEuMS4xLnYyMDEyMDUxMDIzMDUiLz4KQEAgLTUxLDIyICs1MSwyMiBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjAudjIwMTgwNDA5LTE1MDIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudC5zb3VyY2UiIHZlcnNpb249IjQuNS4xMy52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNC52MjAyMTAxMjgtMjIyNSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTQudjIwMjEwMTI4LTIyMjUiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi43LjAudjIwMjEwNjIzLTA2MTgiLz4KLSAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuNy4wLnYyMDIxMDYyMy0wNjE4Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjcuMC52MjAyMTA2MjMtMDYxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUiIHZlcnNpb249IjQuNC4xNS52MjAyMjAyMDktMjM0NSIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUuc291cmNlIiB2ZXJzaW9uPSI0LjQuMTUudjIwMjIwMjA5LTIzNDUiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaSIgdmVyc2lvbj0iMi44LjAudjIwMjExMjI3LTE3NTAiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLnNzaGQub3NnaS5zb3VyY2UiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAiIHZlcnNpb249IjIuOC4wLnYyMDIxMTIyNy0xNzUwIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5zc2hkLnNmdHAuc291cmNlIiB2ZXJzaW9uPSIyLjguMC52MjAyMTEyMjctMTc1MCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5hc3NlcnRqIiB2ZXJzaW9uPSIzLjIwLjIudjIwMjEwNzA2LTExMDQiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuYXNzZXJ0ai5zb3VyY2UiIHZlcnNpb249IjMuMjAuMi52MjAyMTA3MDYtMTEwNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwZyIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXgiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3YiIHZlcnNpb249IjEuNjkuMC52MjAyMTA5MjMtMTQwMSIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmNwcm92LnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDkyMy0xNDAxIi8+Ci0gICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwiIHZlcnNpb249IjEuNjkuMC52MjAyMTA3MTMtMTkyNCIvPgotICAgICAgPHVuaXQgaWQ9Im9yZy5ib3VuY3ljYXN0bGUuYmN1dGlsLnNvdXJjZSIgdmVyc2lvbj0iMS42OS4wLnYyMDIxMDcxMy0xOTI0Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BnIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcGtpeCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3BraXguc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3Byb3Yuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuYm91bmN5Y2FzdGxlLmJjdXRpbCIgdmVyc2lvbj0iMS43MC4wLnYyMDIyMDEwNS0xNTIyIi8+CisgICAgICA8dW5pdCBpZD0ib3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIiB2ZXJzaW9uPSIxLjcwLjAudjIwMjIwMTA1LTE1MjIiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjIuMi4wLnYyMDIxMDcxMS0wODIxIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LnNvdXJjZSIgdmVyc2lvbj0iMi4yLjAudjIwMjEwNzExLTA4MjEiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuc2xmNGouYmluZGluZy5zaW1wbGUuc291cmNlIiB2ZXJzaW9uPSIxLjcuMzAudjIwMjAwMjA0LTIxNTAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54eiIgdmVyc2lvbj0iMS45LjAudjIwMjEwNjI0LTEyNTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcudHVrYWFuaS54ei5zb3VyY2UiIHZlcnNpb249IjEuOS4wLnYyMDIxMDYyNC0xMjU5Ii8+Ci0gICAgICA8cmVwb3NpdG9yeSBsb2NhdGlvbj0iaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvZHJvcHMvUjIwMjExMjEzMTczODEzL3JlcG9zaXRvcnkiLz4KKyAgICAgIDxyZXBvc2l0b3J5IGxvY2F0aW9uPSJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMjAzMDIxNzIyMzMvcmVwb3NpdG9yeSIvPgogICAgIDwvbG9jYXRpb24+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2Uub3NnaSIgdmVyc2lvbj0iMC4wLjAiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMi50cGQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuMjIudHBkCmluZGV4IDM3YzkzYTcuLmViMTcyM2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC4yMi50cGQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjIyLnRwZApAQCAtMSw3ICsxLDcgQEAKIHRhcmdldCAiamdpdC00LjIyIiB3aXRoIHNvdXJjZSBjb25maWd1cmVQaGFzZQogCiBpbmNsdWRlICJwcm9qZWN0cy9qZXR0eS0xMC4wLngudHBkIgotaW5jbHVkZSAib3JiaXQvUjIwMjExMjEzMTczODEzLTIwMjEtMTIudHBkIgoraW5jbHVkZSAib3JiaXQvUjIwMjIwMzAyMTcyMjMzLTIwMjItMDMudHBkIgogCiBsb2NhdGlvbiAiaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9yZWxlYXNlcy8yMDIxLTEyLyIgewogCW9yZy5lY2xpcHNlLm9zZ2kgbGF6eQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvb3JiaXQvUjIwMjIwMzAyMTcyMjMzLTIwMjItMDMudHBkIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvb3JiaXQvUjIwMjIwMzAyMTcyMjMzLTIwMjItMDMudHBkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZmM2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9vcmJpdC9SMjAyMjAzMDIxNzIyMzMtMjAyMi0wMy50cGQKQEAgLTAsMCArMSw2OSBAQAordGFyZ2V0ICJSMjAyMjAzMDIxNzIyMzMiIHdpdGggc291cmNlIGNvbmZpZ3VyZVBoYXNlCisvLyBzZWUgaHR0cHM6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9vcmJpdC9kb3dubG9hZHMvCisKK2xvY2F0aW9uICJodHRwczovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL29yYml0L2Rvd25sb2Fkcy9kcm9wcy9SMjAyMjAzMDIxNzIyMzMvcmVwb3NpdG9yeSIgeworCWNvbS5nb29nbGUuZ3NvbiBbMi44LjkudjIwMjIwMTExLTE0MDksMi44LjkudjIwMjIwMTExLTE0MDldCisJY29tLmdvb2dsZS5nc29uLnNvdXJjZSBbMi44LjkudjIwMjIwMTExLTE0MDksMi44LjkudjIwMjIwMTExLTE0MDldCisJY29tLmpjcmFmdC5qc2NoIFswLjEuNTUudjIwMTkwNDA0LTE5MDIsMC4xLjU1LnYyMDE5MDQwNC0xOTAyXQorCWNvbS5qY3JhZnQuanNjaC5zb3VyY2UgWzAuMS41NS52MjAxOTA0MDQtMTkwMiwwLjEuNTUudjIwMTkwNDA0LTE5MDJdCisJY29tLmpjcmFmdC5qemxpYiBbMS4xLjEudjIwMTIwNTEwMjMwNSwxLjEuMS52MjAxMjA1MTAyMzA1XQorCWNvbS5qY3JhZnQuanpsaWIuc291cmNlIFsxLjEuMS52MjAxMjA1MTAyMzA1LDEuMS4xLnYyMDEyMDUxMDIzMDVdCisJY29tLnN1bi5qbmEgWzUuOC4wLnYyMDIxMDUwMy0wMzQzLDUuOC4wLnYyMDIxMDUwMy0wMzQzXQorCWNvbS5zdW4uam5hLnNvdXJjZSBbNS44LjAudjIwMjEwNTAzLTAzNDMsNS44LjAudjIwMjEwNTAzLTAzNDNdCisJY29tLnN1bi5qbmEucGxhdGZvcm0gWzUuOC4wLnYyMDIxMDQwNi0xMDA0LDUuOC4wLnYyMDIxMDQwNi0xMDA0XQorCWNvbS5zdW4uam5hLnBsYXRmb3JtLnNvdXJjZSBbNS44LjAudjIwMjEwNDA2LTEwMDQsNS44LjAudjIwMjEwNDA2LTEwMDRdCisJamF2YWV3YWggWzEuMS4xMy52MjAyMTEwMjktMDgzOSwxLjEuMTMudjIwMjExMDI5LTA4MzldCisJamF2YWV3YWguc291cmNlIFsxLjEuMTMudjIwMjExMDI5LTA4MzksMS4xLjEzLnYyMDIxMTAyOS0wODM5XQorCW5ldC5ieXRlYnVkZHkuYnl0ZS1idWRkeSBbMS45LjAudjIwMTgxMTA3LTE0MTAsMS45LjAudjIwMTgxMTA3LTE0MTBdCisJbmV0LmJ5dGVidWRkeS5ieXRlLWJ1ZGR5LWFnZW50IFsxLjkuMC52MjAxODExMDYtMTUzNCwxLjkuMC52MjAxODExMDYtMTUzNF0KKwluZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHktYWdlbnQuc291cmNlIFsxLjkuMC52MjAxODExMDYtMTUzNCwxLjkuMC52MjAxODExMDYtMTUzNF0KKwluZXQuYnl0ZWJ1ZGR5LmJ5dGUtYnVkZHkuc291cmNlIFsxLjkuMC52MjAxODExMDctMTQxMCwxLjkuMC52MjAxODExMDctMTQxMF0KKwluZXQuaTJwLmNyeXB0by5lZGRzYSBbMC4zLjAudjIwMjEwOTIzLTE0MDEsMC4zLjAudjIwMjEwOTIzLTE0MDFdCisJbmV0LmkycC5jcnlwdG8uZWRkc2Euc291cmNlIFswLjMuMC52MjAyMTA5MjMtMTQwMSwwLjMuMC52MjAyMTA5MjMtMTQwMV0KKwlvcmcuYXBhY2hlLmFudCBbMS4xMC4xMi52MjAyMTExMDItMTQ1MiwxLjEwLjEyLnYyMDIxMTEwMi0xNDUyXQorCW9yZy5hcGFjaGUuYW50LnNvdXJjZSBbMS4xMC4xMi52MjAyMTExMDItMTQ1MiwxLjEwLjEyLnYyMDIxMTEwMi0xNDUyXQorCW9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYyBbMS4xNC4wLnYyMDIwMDgxOC0xNDIyLDEuMTQuMC52MjAyMDA4MTgtMTQyMl0KKwlvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuc291cmNlIFsxLjE0LjAudjIwMjAwODE4LTE0MjIsMS4xNC4wLnYyMDIwMDgxOC0xNDIyXQorCW9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcyBbMS4yMS4wLnYyMDIxMTEwMy0yMTAwLDEuMjEuMC52MjAyMTExMDMtMjEwMF0KKwlvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3Muc291cmNlIFsxLjIxLjAudjIwMjExMTAzLTIxMDAsMS4yMS4wLnYyMDIxMTEwMy0yMTAwXQorCW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nIFsxLjIuMC52MjAxODA0MDktMTUwMiwxLjIuMC52MjAxODA0MDktMTUwMl0KKwlvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UgWzEuMi4wLnYyMDE4MDQwOS0xNTAyLDEuMi4wLnYyMDE4MDQwOS0xNTAyXQorCW9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNsaWVudCBbNC41LjEzLnYyMDIxMDEyOC0yMjI1LDQuNS4xMy52MjAyMTAxMjgtMjIyNV0KKwlvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzLmh0dHBjbGllbnQuc291cmNlIFs0LjUuMTMudjIwMjEwMTI4LTIyMjUsNC41LjEzLnYyMDIxMDEyOC0yMjI1XQorCW9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMuaHR0cGNvcmUgWzQuNC4xNS52MjAyMjAyMDktMjM0NSw0LjQuMTUudjIwMjIwMjA5LTIzNDVdCisJb3JnLmFwYWNoZS5odHRwY29tcG9uZW50cy5odHRwY29yZS5zb3VyY2UgWzQuNC4xNS52MjAyMjAyMDktMjM0NSw0LjQuMTUudjIwMjIwMjA5LTIzNDVdCisJb3JnLmFwYWNoZS5zc2hkLm9zZ2kgWzIuOC4wLnYyMDIxMTIyNy0xNzUwLDIuOC4wLnYyMDIxMTIyNy0xNzUwXQorCW9yZy5hcGFjaGUuc3NoZC5vc2dpLnNvdXJjZSBbMi44LjAudjIwMjExMjI3LTE3NTAsMi44LjAudjIwMjExMjI3LTE3NTBdCisJb3JnLmFwYWNoZS5zc2hkLnNmdHAgWzIuOC4wLnYyMDIxMTIyNy0xNzUwLDIuOC4wLnYyMDIxMTIyNy0xNzUwXQorCW9yZy5hcGFjaGUuc3NoZC5zZnRwLnNvdXJjZSBbMi44LjAudjIwMjExMjI3LTE3NTAsMi44LjAudjIwMjExMjI3LTE3NTBdCisJb3JnLmFzc2VydGogWzMuMjAuMi52MjAyMTA3MDYtMTEwNCwzLjIwLjIudjIwMjEwNzA2LTExMDRdCisJb3JnLmFzc2VydGouc291cmNlIFszLjIwLjIudjIwMjEwNzA2LTExMDQsMy4yMC4yLnYyMDIxMDcwNi0xMTA0XQorCW9yZy5ib3VuY3ljYXN0bGUuYmNwZyBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcGcuc291cmNlIFsxLjcwLjAudjIwMjIwMTA1LTE1MjIsMS43MC4wLnYyMDIyMDEwNS0xNTIyXQorCW9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4IFsxLjcwLjAudjIwMjIwMTA1LTE1MjIsMS43MC4wLnYyMDIyMDEwNS0xNTIyXQorCW9yZy5ib3VuY3ljYXN0bGUuYmNwa2l4LnNvdXJjZSBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdiBbMS43MC4wLnYyMDIyMDEwNS0xNTIyLDEuNzAuMC52MjAyMjAxMDUtMTUyMl0KKwlvcmcuYm91bmN5Y2FzdGxlLmJjcHJvdi5zb3VyY2UgWzEuNzAuMC52MjAyMjAxMDUtMTUyMiwxLjcwLjAudjIwMjIwMTA1LTE1MjJdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwgWzEuNzAuMC52MjAyMjAxMDUtMTUyMiwxLjcwLjAudjIwMjIwMTA1LTE1MjJdCisJb3JnLmJvdW5jeWNhc3RsZS5iY3V0aWwuc291cmNlIFsxLjcwLjAudjIwMjIwMTA1LTE1MjIsMS43MC4wLnYyMDIyMDEwNS0xNTIyXQorCW9yZy5oYW1jcmVzdCBbMi4yLjAudjIwMjEwNzExLTA4MjEsMi4yLjAudjIwMjEwNzExLTA4MjFdCisJb3JnLmhhbWNyZXN0LnNvdXJjZSBbMi4yLjAudjIwMjEwNzExLTA4MjEsMi4yLjAudjIwMjEwNzExLTA4MjFdCisJb3JnLmhhbWNyZXN0LmNvcmUgWzEuMy4wLnYyMDE4MDQyMC0xNTE5LDEuMy4wLnYyMDE4MDQyMC0xNTE5XQorCW9yZy5oYW1jcmVzdC5jb3JlLnNvdXJjZSBbMS4zLjAudjIwMTgwNDIwLTE1MTksMS4zLjAudjIwMTgwNDIwLTE1MTldCisJb3JnLmhhbWNyZXN0LmxpYnJhcnkgWzEuMy4wLnYyMDE4MDUyNC0yMjQ2LDEuMy4wLnYyMDE4MDUyNC0yMjQ2XQorCW9yZy5oYW1jcmVzdC5saWJyYXJ5LnNvdXJjZSBbMS4zLjAudjIwMTgwNTI0LTIyNDYsMS4zLjAudjIwMTgwNTI0LTIyNDZdCisJb3JnLmp1bml0IFs0LjEzLjIudjIwMjExMDE4LTE5NTYsNC4xMy4yLnYyMDIxMTAxOC0xOTU2XQorCW9yZy5qdW5pdC5zb3VyY2UgWzQuMTMuMi52MjAyMTEwMTgtMTk1Niw0LjEzLjIudjIwMjExMDE4LTE5NTZdCisJb3JnLmtvaHN1a2UuYXJnczRqIFsyLjMzLjAudjIwMTYwMzIzLTIyMTgsMi4zMy4wLnYyMDE2MDMyMy0yMjE4XQorCW9yZy5rb2hzdWtlLmFyZ3M0ai5zb3VyY2UgWzIuMzMuMC52MjAxNjAzMjMtMjIxOCwyLjMzLjAudjIwMTYwMzIzLTIyMThdCisJb3JnLm1vY2tpdG8gWzIuMjMuMC52MjAyMDAzMTAtMTY0MiwyLjIzLjAudjIwMjAwMzEwLTE2NDJdCisJb3JnLm1vY2tpdG8uc291cmNlIFsyLjIzLjAudjIwMjAwMzEwLTE2NDIsMi4yMy4wLnYyMDIwMDMxMC0xNjQyXQorCW9yZy5vYmplbmVzaXMgWzIuNi4wLnYyMDE4MDQyMC0xNTE5LDIuNi4wLnYyMDE4MDQyMC0xNTE5XQorCW9yZy5vYmplbmVzaXMuc291cmNlIFsyLjYuMC52MjAxODA0MjAtMTUxOSwyLjYuMC52MjAxODA0MjAtMTUxOV0KKwlvcmcuc2xmNGouYXBpIFsxLjcuMzAudjIwMjAwMjA0LTIxNTAsMS43LjMwLnYyMDIwMDIwNC0yMTUwXQorCW9yZy5zbGY0ai5hcGkuc291cmNlIFsxLjcuMzAudjIwMjAwMjA0LTIxNTAsMS43LjMwLnYyMDIwMDIwNC0yMTUwXQorCW9yZy5zbGY0ai5iaW5kaW5nLnNpbXBsZSBbMS43LjMwLnYyMDIwMDIwNC0yMTUwLDEuNy4zMC52MjAyMDAyMDQtMjE1MF0KKwlvcmcuc2xmNGouYmluZGluZy5zaW1wbGUuc291cmNlIFsxLjcuMzAudjIwMjAwMjA0LTIxNTAsMS43LjMwLnYyMDIwMDIwNC0yMTUwXQorCW9yZy50dWthYW5pLnh6IFsxLjkuMC52MjAyMTA2MjQtMTI1OSwxLjkuMC52MjAyMTA2MjQtMTI1OV0KKwlvcmcudHVrYWFuaS54ei5zb3VyY2UgWzEuOS4wLnYyMDIxMDYyNC0xMjU5LDEuOS4wLnYyMDIxMDYyNC0xMjU5XQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwKaW5kZXggOGJlZTFmYy4uMmE5NTA0MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9wb20ueG1sCkBAIC0xNiw3ICsxNiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42LjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj42LjEuMS1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC50YXJnZXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvcG9tLnhtbAppbmRleCA5OWRhMTkxLi4wYzA1MzY5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwKQEAgLTE2LDcgKzE2LDcgQEAKIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgogCiAgIDxuYW1lPkpHaXQgVHljaG8gUGFyZW50PC9uYW1lPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggYWYwMGIwYS4uZjVjNGRlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDI4ICszLDMwIEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249IjYuMC4xIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDt2ZXJzaW9uPSI2LjEuMSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bGVzO3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3BvbS54bWwKaW5kZXggY2QyYmI2My4uYzgyNDc4OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EZXNjcmliZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlVGVzdC5qYXZhCmluZGV4IDRiYWQ3M2IuLmM3ODU0NDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0Rlc2NyaWJlVGVzdC5qYXZhCkBAIC04OSw2ICs4OSwzMSBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmVDb21taXRNYXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQ29tbWl0TWF0Y2hBYmJyZXYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW5pdGlhbENvbW1pdEFuZFRhZygpOworCQlzZWNvbmRDb21taXQoKTsKKwkJYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsgInYxLjAtMS1nNTZmNmNlYmRmM2Y1IiwgIiIgfSwKKwkJCQlleGVjdXRlKCJnaXQgZGVzY3JpYmUgLS1hYmJyZXYgMTIgLS1tYXRjaCB2MS4qIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQ29tbWl0TWF0Y2hBYmJyZXZNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJaW5pdGlhbENvbW1pdEFuZFRhZygpOworCQlzZWNvbmRDb21taXQoKTsKKwkJYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsgInYxLjAtMS1nNTZmNiIsICIiIH0sCisJCQkJZXhlY3V0ZSgiZ2l0IGRlc2NyaWJlIC0tYWJicmV2IC01IC0tbWF0Y2ggdjEuKiIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZXNjcmliZUNvbW1pdE1hdGNoQWJicmV2TWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWluaXRpYWxDb21taXRBbmRUYWcoKTsKKwkJc2Vjb25kQ29tbWl0KCk7CisJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7CisJCQkJInYxLjAtMS1nNTZmNmNlYmRmM2Y1Y2VlZWNkODAzMzY1YWJmMDk5NmZiMWZhMDA2ZCIsICIiIH0sCisJCQkJZXhlY3V0ZSgiZ2l0IGRlc2NyaWJlIC0tYWJicmV2IDUwIC0tbWF0Y2ggdjEuKiIpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3REZXNjcmliZUNvbW1pdE1hdGNoMigpIHRocm93cyBFeGNlcHRpb24gewogCQlpbml0aWFsQ29tbWl0QW5kVGFnKCk7CiAJCXNlY29uZENvbW1pdCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZlRvb2xUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVG9vbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2JmNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZlRvb2xUZXN0LmphdmEKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIFNpbWVvbiBBbmRyZWV2IDxzaW1lb24uZGFuYWlsb3YuYW5kcmVldkBnbWFpbC5jb20+IGFuZCBvdGhlcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbC5Db21tYW5kTGluZURpZmZUb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNMSVJlcG9zaXRvcnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuQ21kTGluZVBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuU3ViY29tbWFuZEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5Bcmd1bWVudDsKKworLyoqCisgKiBUZXN0aW5nIHRoZSB7QGNvZGUgZGlmZnRvb2x9IGNvbW1hbmQuCisgKi8KK3B1YmxpYyBjbGFzcyBEaWZmVG9vbFRlc3QgZXh0ZW5kcyBDTElSZXBvc2l0b3J5VGVzdENhc2UgeworCXB1YmxpYyBzdGF0aWMgY2xhc3MgR2l0Q2xpSkdpdFdyYXBwZXJQYXJzZXIgeworCQlAQXJndW1lbnQoaW5kZXggPSAwLCBtZXRhVmFyID0gIm1ldGFWYXJfY29tbWFuZCIsIHJlcXVpcmVkID0gdHJ1ZSwgaGFuZGxlciA9IFN1YmNvbW1hbmRIYW5kbGVyLmNsYXNzKQorCQlUZXh0QnVpbHRpbiBzdWJjb21tYW5kOworCisJCUBBcmd1bWVudChpbmRleCA9IDEsIG1ldGFWYXIgPSAibWV0YVZhcl9hcmciKQorCQlMaXN0PFN0cmluZz4gYXJndW1lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmdbXSBydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KFN0cmluZy4uLiBhcmdzKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNMSUdpdENvbW1hbmQuUmVzdWx0IHJlc3VsdCA9IG5ldyBDTElHaXRDb21tYW5kLlJlc3VsdCgpOworCisJCUdpdENsaUpHaXRXcmFwcGVyUGFyc2VyIGJlYW4gPSBuZXcgR2l0Q2xpSkdpdFdyYXBwZXJQYXJzZXIoKTsKKwkJQ21kTGluZVBhcnNlciBjbHAgPSBuZXcgQ21kTGluZVBhcnNlcihiZWFuKTsKKwkJY2xwLnBhcnNlQXJndW1lbnQoYXJncyk7CisKKwkJVGV4dEJ1aWx0aW4gY21kID0gYmVhbi5zdWJjb21tYW5kOworCQljbWQuaW5pdFJhdyhkYiwgbnVsbCwgbnVsbCwgcmVzdWx0Lm91dCwgcmVzdWx0LmVycik7CisJCWNtZC5leGVjdXRlKGJlYW4uYXJndW1lbnRzLnRvQXJyYXkobmV3IFN0cmluZ1tiZWFuLmFyZ3VtZW50cy5zaXplKCldKSk7CisJCWlmIChjbWQuZ2V0T3V0cHV0V3JpdGVyKCkgIT0gbnVsbCkgeworCQkJY21kLmdldE91dHB1dFdyaXRlcigpLmZsdXNoKCk7CisJCX0KKwkJaWYgKGNtZC5nZXRFcnJvcldyaXRlcigpICE9IG51bGwpIHsKKwkJCWNtZC5nZXRFcnJvcldyaXRlcigpLmZsdXNoKCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdC5vdXRMaW5lcygpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisJfQorCisJcHJpdmF0ZSBHaXQgZ2l0OworCisJQE92ZXJyaWRlCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCWdpdCA9IG5ldyBHaXQoZGIpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9vbCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbWl0ID0gY3JlYXRlVW5zdGFnZWRDaGFuZ2VzKCk7CisJCUxpc3Q8RGlmZkVudHJ5PiBjaGFuZ2VzID0gZ2V0UmVwb3NpdG9yeUNoYW5nZXMoY29tbWl0KTsKKwkJU3RyaW5nW10gZXhwZWN0ZWRPdXRwdXQgPSBnZXRFeHBlY3RlZERpZmZUb29sT3V0cHV0KGNoYW5nZXMpOworCisJCVN0cmluZ1tdIG9wdGlvbnMgPSB7CisJCQkJIi0tdG9vbCIsCisJCQkJIi10IiwKKwkJfTsKKworCQlmb3IgKFN0cmluZyBvcHRpb24gOiBvcHRpb25zKSB7CisJCQlhc3NlcnRBcnJheU9mTGluZXNFcXVhbHMoIkluY29ycmVjdCBvdXRwdXQgZm9yIG9wdGlvbjogIiArIG9wdGlvbiwKKwkJCQkJZXhwZWN0ZWRPdXRwdXQsCisJCQkJCXJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoImRpZmZ0b29sIiwgb3B0aW9uLAorCQkJCQkJCSJzb21lX3Rvb2wiKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUb29sVHJ1c3RFeGl0Q29kZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbWl0ID0gY3JlYXRlVW5zdGFnZWRDaGFuZ2VzKCk7CisJCUxpc3Q8RGlmZkVudHJ5PiBjaGFuZ2VzID0gZ2V0UmVwb3NpdG9yeUNoYW5nZXMoY29tbWl0KTsKKwkJU3RyaW5nW10gZXhwZWN0ZWRPdXRwdXQgPSBnZXRFeHBlY3RlZERpZmZUb29sT3V0cHV0KGNoYW5nZXMpOworCisJCVN0cmluZ1tdIG9wdGlvbnMgPSB7ICItLXRvb2wiLCAiLXQiLCB9OworCisJCWZvciAoU3RyaW5nIG9wdGlvbiA6IG9wdGlvbnMpIHsKKwkJCWFzc2VydEFycmF5T2ZMaW5lc0VxdWFscygiSW5jb3JyZWN0IG91dHB1dCBmb3Igb3B0aW9uOiAiICsgb3B0aW9uLAorCQkJCQlleHBlY3RlZE91dHB1dCwgcnVuQW5kQ2FwdHVyZVVzaW5nSW5pdFJhdygiZGlmZnRvb2wiLAorCQkJCQkJCSItLXRydXN0LWV4aXQtY29kZSIsIG9wdGlvbiwgInNvbWVfdG9vbCIpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvb2xOb0d1aU5vUHJvbXB0Tm9UcnVzdEV4aXRjb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBjb21taXQgPSBjcmVhdGVVbnN0YWdlZENoYW5nZXMoKTsKKwkJTGlzdDxEaWZmRW50cnk+IGNoYW5nZXMgPSBnZXRSZXBvc2l0b3J5Q2hhbmdlcyhjb21taXQpOworCQlTdHJpbmdbXSBleHBlY3RlZE91dHB1dCA9IGdldEV4cGVjdGVkRGlmZlRvb2xPdXRwdXQoY2hhbmdlcyk7CisKKwkJU3RyaW5nW10gb3B0aW9ucyA9IHsgIi0tdG9vbCIsICItdCIsIH07CisKKwkJZm9yIChTdHJpbmcgb3B0aW9uIDogb3B0aW9ucykgeworCQkJYXNzZXJ0QXJyYXlPZkxpbmVzRXF1YWxzKCJJbmNvcnJlY3Qgb3V0cHV0IGZvciBvcHRpb246ICIgKyBvcHRpb24sCisJCQkJCWV4cGVjdGVkT3V0cHV0LCBydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KCJkaWZmdG9vbCIsCisJCQkJCQkJIi0tbm8tZ3VpIiwgIi0tbm8tcHJvbXB0IiwgIi0tbm8tdHJ1c3QtZXhpdC1jb2RlIiwKKwkJCQkJCQlvcHRpb24sICJzb21lX3Rvb2wiKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUb29sQ2FjaGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBjb21taXQgPSBjcmVhdGVTdGFnZWRDaGFuZ2VzKCk7CisJCUxpc3Q8RGlmZkVudHJ5PiBjaGFuZ2VzID0gZ2V0UmVwb3NpdG9yeUNoYW5nZXMoY29tbWl0KTsKKwkJU3RyaW5nW10gZXhwZWN0ZWRPdXRwdXQgPSBnZXRFeHBlY3RlZERpZmZUb29sT3V0cHV0KGNoYW5nZXMpOworCisJCVN0cmluZ1tdIG9wdGlvbnMgPSB7ICItLWNhY2hlZCIsICItLXN0YWdlZCIsIH07CisKKwkJZm9yIChTdHJpbmcgb3B0aW9uIDogb3B0aW9ucykgeworCQkJYXNzZXJ0QXJyYXlPZkxpbmVzRXF1YWxzKCJJbmNvcnJlY3Qgb3V0cHV0IGZvciBvcHRpb246ICIgKyBvcHRpb24sCisJCQkJCWV4cGVjdGVkT3V0cHV0LCBydW5BbmRDYXB0dXJlVXNpbmdJbml0UmF3KCJkaWZmdG9vbCIsCisJCQkJCQkJb3B0aW9uLCAiLS10b29sIiwgInNvbWVfdG9vbCIpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvb2xIZWxwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNvbW1hbmRMaW5lRGlmZlRvb2xbXSBkZWZhdWx0VG9vbHMgPSBDb21tYW5kTGluZURpZmZUb29sLnZhbHVlcygpOworCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRPdXRwdXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZXhwZWN0ZWRPdXRwdXQuYWRkKCJnaXQgZGlmZnRvb2wgLS10b29sPTx0b29sPiBtYXkgYmUgc2V0IHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiIpOworCQlmb3IgKENvbW1hbmRMaW5lRGlmZlRvb2wgZGVmYXVsdFRvb2wgOiBkZWZhdWx0VG9vbHMpIHsKKwkJCVN0cmluZyB0b29sTmFtZSA9IGRlZmF1bHRUb29sLm5hbWUoKTsKKwkJCWV4cGVjdGVkT3V0cHV0LmFkZCh0b29sTmFtZSk7CisJCX0KKwkJU3RyaW5nW10gdXNlckRlZmluZWRUb29sc0hlbHAgPSB7CisJCQkJInVzZXItZGVmaW5lZDoiLAorCQkJCSJUaGUgZm9sbG93aW5nIHRvb2xzIGFyZSB2YWxpZCwgYnV0IG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlOiIsCisJCQkJIlNvbWUgb2YgdGhlIHRvb2xzIGxpc3RlZCBhYm92ZSBvbmx5IHdvcmsgaW4gYSB3aW5kb3dlZCIsCisJCQkJImVudmlyb25tZW50LiBJZiBydW4gaW4gYSB0ZXJtaW5hbC1vbmx5IHNlc3Npb24sIHRoZXkgd2lsbCBmYWlsLiIsCisJCX07CisJCWV4cGVjdGVkT3V0cHV0LmFkZEFsbChBcnJheXMuYXNMaXN0KHVzZXJEZWZpbmVkVG9vbHNIZWxwKSk7CisKKwkJU3RyaW5nIG9wdGlvbiA9ICItLXRvb2wtaGVscCI7CisJCWFzc2VydEFycmF5T2ZMaW5lc0VxdWFscygiSW5jb3JyZWN0IG91dHB1dCBmb3Igb3B0aW9uOiAiICsgb3B0aW9uLAorCQkJCWV4cGVjdGVkT3V0cHV0LnRvQXJyYXkobmV3IFN0cmluZ1swXSksIHJ1bkFuZENhcHR1cmVVc2luZ0luaXRSYXcoImRpZmZ0b29sIiwgb3B0aW9uKSk7CisJfQorCisJcHJpdmF0ZSBSZXZDb21taXQgY3JlYXRlVW5zdGFnZWRDaGFuZ2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXdyaXRlVHJhc2hGaWxlKCJhIiwgIkhlbGxvIHdvcmxkIGEiKTsKKwkJd3JpdGVUcmFzaEZpbGUoImIiLCAiSGVsbG8gd29ybGQgYiIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiZmlsZXMgYSAmIGIiKS5jYWxsKCk7CisJCXdyaXRlVHJhc2hGaWxlKCJhIiwgIk5ldyBIZWxsbyB3b3JsZCBhIik7CisJCXdyaXRlVHJhc2hGaWxlKCJiIiwgIk5ldyBIZWxsbyB3b3JsZCBiIik7CisJCXJldHVybiBjb21taXQ7CisJfQorCisJcHJpdmF0ZSBSZXZDb21taXQgY3JlYXRlU3RhZ2VkQ2hhbmdlcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbWl0ID0gY3JlYXRlVW5zdGFnZWRDaGFuZ2VzKCk7CisJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJcmV0dXJuIGNvbW1pdDsKKwl9CisKKwlwcml2YXRlIExpc3Q8RGlmZkVudHJ5PiBnZXRSZXBvc2l0b3J5Q2hhbmdlcyhSZXZDb21taXQgY29tbWl0KQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKTsKKwkJdHcuYWRkVHJlZShjb21taXQuZ2V0VHJlZSgpKTsKKwkJRmlsZVRyZWVJdGVyYXRvciBtb2RpZmllZFRyZWUgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihkYik7CisJCXR3LmFkZFRyZWUobW9kaWZpZWRUcmVlKTsKKwkJTGlzdDxEaWZmRW50cnk+IGNoYW5nZXMgPSBEaWZmRW50cnkuc2Nhbih0dyk7CisJCXJldHVybiBjaGFuZ2VzOworCX0KKworCXByaXZhdGUgU3RyaW5nW10gZ2V0RXhwZWN0ZWREaWZmVG9vbE91dHB1dChMaXN0PERpZmZFbnRyeT4gY2hhbmdlcykgeworCQlTdHJpbmdbXSBleHBlY3RlZFRvb2xPdXRwdXQgPSBuZXcgU3RyaW5nW2NoYW5nZXMuc2l6ZSgpXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLnNpemUoKTsgKytpKSB7CisJCQlEaWZmRW50cnkgY2hhbmdlID0gY2hhbmdlcy5nZXQoaSk7CisJCQlTdHJpbmcgbmV3UGF0aCA9IGNoYW5nZS5nZXROZXdQYXRoKCk7CisJCQlTdHJpbmcgb2xkUGF0aCA9IGNoYW5nZS5nZXRPbGRQYXRoKCk7CisJCQlTdHJpbmcgbmV3SWROYW1lID0gY2hhbmdlLmdldE5ld0lkKCkubmFtZSgpOworCQkJU3RyaW5nIG9sZElkTmFtZSA9IGNoYW5nZS5nZXRPbGRJZCgpLm5hbWUoKTsKKwkJCVN0cmluZyBleHBlY3RlZExpbmUgPSAiTVx0IiArIG5ld1BhdGggKyAiICgiICsgbmV3SWROYW1lICsgIikiCisJCQkJCSsgIlx0IiArIG9sZFBhdGggKyAiICgiICsgb2xkSWROYW1lICsgIikiOworCQkJZXhwZWN0ZWRUb29sT3V0cHV0W2ldID0gZXhwZWN0ZWRMaW5lOworCQl9CisJCXJldHVybiBleHBlY3RlZFRvb2xPdXRwdXQ7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheU9mTGluZXNFcXVhbHMoU3RyaW5nIGZhaWxNZXNzYWdlLAorCQkJU3RyaW5nW10gZXhwZWN0ZWQsIFN0cmluZ1tdIGFjdHVhbCkgeworCQlhc3NlcnRFcXVhbHMoZmFpbE1lc3NhZ2UsIHRvU3RyaW5nKGV4cGVjdGVkKSwgdG9TdHJpbmcoYWN0dWFsKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2hUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaFRlc3QuamF2YQppbmRleCA1NjRiZDVmLi4xYzZiNzgzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaFRlc3QuamF2YQpAQCAtMzMsNiArMzMsNyBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CiAKIAkJUmVwb3NpdG9yeSByZW1vdGVSZXBvc2l0b3J5ID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UocmVtb3RlUmVwb3NpdG9yeSk7CiAJCXJlbW90ZUdpdCA9IG5ldyBHaXQocmVtb3RlUmVwb3NpdG9yeSk7CiAKIAkJLy8gc2V0dXAgdGhlIGZpcnN0IHJlcG9zaXRvcnkgdG8gZmV0Y2ggZnJvbSB0aGUgc2Vjb25kIHJlcG9zaXRvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZmZhYWZjMS4uZWQ5ODBiNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQucGdtCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbQotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQpAQCAtMTQsNDcgKzE0LDQ5IEBACiAgb3JnLmVjbGlwc2UuamV0dHkuc2VydmxldDt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWw7dmVyc2lvbj0iWzEwLjAuMCwxMS4wLjApIiwKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmNvbXBvbmVudDt2ZXJzaW9uPSJbMTAuMC4wLDExLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmJsYW1lO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnMzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoLmpzY2g7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnMzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoLmpzY2g7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCiAgb3JnLmtvaHN1a2UuYXJnczRqO3ZlcnNpb249IlsyLjMzLjAsMy4wLjApIiwKICBvcmcua29oc3VrZS5hcmdzNGouc3BpO3ZlcnNpb249IlsyLjMzLjAsMy4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuY29uc29sZTt2ZXJzaW9uPSI2LjAuMSI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5jb25zb2xlO3ZlcnNpb249IjYuMS4xIjsKICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLAogICAgb3JnLmVjbGlwc2UuamdpdC5hd3R1aSwKQEAgLTY2LDE0ICs2OCwxNCBAQAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXBpLAogICAgamF2YXguc3dpbmciLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1Zzt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8sCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbSwKICAgIG9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSI2LjEuMSI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdDt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0O3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5rb2hzdWtlLmFyZ3M0aiwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IDI2MjY5ZDcuLjBhNWRkODggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20gLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iNi4xLjEucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL3NlcnZpY2VzL29yZy5lY2xpcHNlLmpnaXQucGdtLlRleHRCdWlsdGluIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvc2VydmljZXMvb3JnLmVjbGlwc2UuamdpdC5wZ20uVGV4dEJ1aWx0aW4KaW5kZXggZTY0NTI1NS4uOGM0NDc2NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvc2VydmljZXMvb3JnLmVjbGlwc2UuamdpdC5wZ20uVGV4dEJ1aWx0aW4KKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvc2VydmljZXMvb3JnLmVjbGlwc2UuamdpdC5wZ20uVGV4dEJ1aWx0aW4KQEAgLTEyLDYgKzEyLDcgQEAKIG9yZy5lY2xpcHNlLmpnaXQucGdtLkRhZW1vbgogb3JnLmVjbGlwc2UuamdpdC5wZ20uRGVzY3JpYmUKIG9yZy5lY2xpcHNlLmpnaXQucGdtLkRpZmYKK29yZy5lY2xpcHNlLmpnaXQucGdtLkRpZmZUb29sCiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5EaWZmVHJlZQogb3JnLmVjbGlwc2UuamdpdC5wZ20uRmV0Y2gKIG9yZy5lY2xpcHNlLmpnaXQucGdtLkdjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbAppbmRleCAwNWUwYmNjLi5jMTg5ZGM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnBnbTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5wcm9wZXJ0aWVzCmluZGV4IGFlMTBhZjIuLmMzNjQzNzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcwpAQCAtNTgsNiArNTgsOSBAQAogZGF0ZUluZm89RGF0ZTogICB7MH0KIGRlbGV0ZWRCcmFuY2g9RGVsZXRlZCBicmFuY2ggezB9CiBkZWxldGVkUmVtb3RlQnJhbmNoPURlbGV0ZWQgcmVtb3RlIGJyYW5jaCB7MH0KK2RpZmZUb29sSGVscFNldFRvRm9sbG93aW5nPSdnaXQgZGlmZnRvb2wgLS10b29sPTx0b29sPicgbWF5IGJlIHNldCB0byBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbnswfVxuXHR1c2VyLWRlZmluZWQ6XG57MX1cblRoZSBmb2xsb3dpbmcgdG9vbHMgYXJlIHZhbGlkLCBidXQgbm90IGN1cnJlbnRseSBhdmFpbGFibGU6XG57Mn1cblNvbWUgb2YgdGhlIHRvb2xzIGxpc3RlZCBhYm92ZSBvbmx5IHdvcmsgaW4gYSB3aW5kb3dlZFxuZW52aXJvbm1lbnQuIElmIHJ1biBpbiBhIHRlcm1pbmFsLW9ubHkgc2Vzc2lvbiwgdGhleSB3aWxsIGZhaWwuCitkaWZmVG9vbExhdW5jaD1WaWV3aW5nICh7MH0vezF9KTogJ3syfSdcbkxhdW5jaCAnezN9JyBbWS9uXT8KK2RpZmZUb29sRGllZD1leHRlcm5hbCBkaWZmIGRpZWQsIHN0b3BwaW5nIGF0IHswfQogZG9lc05vdEV4aXN0PXswfSBkb2VzIG5vdCBleGlzdAogZG9udE92ZXJ3cml0ZUxvY2FsQ2hhbmdlcz1lcnJvcjogWW91ciBsb2NhbCBjaGFuZ2VzIHRvIHRoZSBmb2xsb3dpbmcgZmlsZSB3b3VsZCBiZSBvdmVyd3JpdHRlbiBieSBtZXJnZToKIGV2ZXJ5dGhpbmdVcFRvRGF0ZT1FdmVyeXRoaW5nIHVwLXRvLWRhdGUKQEAgLTE0NSw2ICsxNDgsNyBAQAogbWV0YVZhcl9zZWNvbmRzPVNFQ09ORFMKIG1ldGFWYXJfc2VydmljZT1TRVJWSUNFCiBtZXRhVmFyX3RhZ0xvY2FsVXNlcj08R1BHIGtleSBJRD4KK21ldGFWYXJfdG9vbD1UT09MCiBtZXRhVmFyX3RyZWVpc2g9dHJlZS1pc2gKIG1ldGFWYXJfdXJpaXNoPXVyaS1pc2gKIG1ldGFWYXJfdXJsPVVSTApAQCAtMjI1LDYgKzIyOSw3IEBACiB1bnN1cHBvcnRlZE9wZXJhdGlvbj1VbnN1cHBvcnRlZCBvcGVyYXRpb246IHswfQogdW50cmFja2VkRmlsZXM9VW50cmFja2VkIGZpbGVzOgogdXBkYXRpbmc9VXBkYXRpbmcgezB9Li57MX0KK3VzYWdlX0FiYnJldj1JbnN0ZWFkIG9mIHVzaW5nIHRoZSBkZWZhdWx0IG51bWJlciBvZiBoZXhhZGVjaW1hbCBkaWdpdHMgKHdoaWNoIHdpbGwgdmFyeSBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSByZXBvc2l0b3J5IHdpdGggYSBkZWZhdWx0IG9mIDcpIG9mIHRoZSBhYmJyZXZpYXRlZCBvYmplY3QgbmFtZSwgdXNlIDxuPiBkaWdpdHMsIG9yIGFzIG1hbnkgZGlnaXRzIGFzIG5lZWRlZCB0byBmb3JtIGEgdW5pcXVlIG9iamVjdCBuYW1lLiBBbiA8bj4gb2YgMCB3aWxsIHN1cHByZXNzIGxvbmcgZm9ybWF0LCBvbmx5IHNob3dpbmcgdGhlIGNsb3Nlc3QgdGFnLgogdXNhZ2VfQWdncmVzc2l2ZT1UaGlzIG9wdGlvbiB3aWxsIGNhdXNlIGdjIHRvIG1vcmUgYWdncmVzc2l2ZWx5IG9wdGltaXplIHRoZSByZXBvc2l0b3J5IGF0IHRoZSBleHBlbnNlIG9mIHRha2luZyBtdWNoIG1vcmUgdGltZQogdXNhZ2VfQWx3YXlzRmFsbGJhY2s9U2hvdyB1bmlxdWVseSBhYmJyZXZpYXRlZCBjb21taXQgb2JqZWN0IGFzIGZhbGxiYWNrCiB1c2FnZV9iYXJlQ2xvbmU9TWFrZSBhIGJhcmUgR2l0IHJlcG9zaXRvcnkuIFRoYXQgaXMsIGluc3RlYWQgb2YgY3JlYXRpbmcgW0RJUkVDVE9SWV0gYW5kIHBsYWNpbmcgdGhlIGFkbWluaXN0cmF0aXZlIGZpbGVzIGluIFtESVJFQ1RPUlldLy5naXQsIG1ha2UgdGhlIFtESVJFQ1RPUlldIGl0c2VsZiB0aGUgJEdJVF9ESVIuCkBAIC0yNDksNiArMjU0LDggQEAKIHVzYWdlX0Rpc3BsYXlUaGVWZXJzaW9uT2ZKZ2l0PURpc3BsYXkgdGhlIHZlcnNpb24gb2YgamdpdAogdXNhZ2VfR2M9Q2xlYW51cCB1bm5lY2Vzc2FyeSBmaWxlcyBhbmQgb3B0aW1pemUgdGhlIGxvY2FsIHJlcG9zaXRvcnkKIHVzYWdlX0dsb2c9VmlldyBjb21taXQgaGlzdG9yeSBhcyBhIGdyYXBoCit1c2FnZV9EaWZmR3VpVG9vbD1XaGVuIGdpdC1kaWZmdG9vbCBpcyBpbnZva2VkIHdpdGggdGhlIC1nIG9yIC0tZ3VpIG9wdGlvbiB0aGUgZGVmYXVsdCBkaWZmIHRvb2wgd2lsbCBiZSByZWFkIGZyb20gdGhlIGNvbmZpZ3VyZWQgZGlmZi5ndWl0b29sIHZhcmlhYmxlIGluc3RlYWQgb2YgZGlmZi50b29sLgordXNhZ2Vfbm9HdWk9VGhlIC0tbm8tZ3VpIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSAtZyBvciAtLWd1aSBzZXR0aW5nLgogdXNhZ2VfSW5kZXhQYWNrPUJ1aWxkIHBhY2sgaW5kZXggZmlsZSBmb3IgYW4gZXhpc3RpbmcgcGFja2VkIGFyY2hpdmUKIHVzYWdlX0xGU0RpcmVjdG9yeT1EaXJlY3RvcnkgdG8gc3RvcmUgbGFyZ2Ugb2JqZWN0cwogdXNhZ2VfTEZTUG9ydD1TZXJ2ZXIgaHR0cCBwb3J0CkBAIC0yOTYsNiArMzAzLDcgQEAKIHVzYWdlX1N0YXR1cz1TaG93IHRoZSB3b3JraW5nIHRyZWUgc3RhdHVzCiB1c2FnZV9TdG9wVHJhY2tpbmdBRmlsZT1TdG9wIHRyYWNraW5nIGEgZmlsZQogdXNhZ2VfVGV4dEhhc2hGdW5jdGlvbnM9U2NhbiByZXBvc2l0b3J5IHRvIGNvbXB1dGUgbWF4aW11bSBudW1iZXIgb2YgY29sbGlzaW9ucyBmb3IgaGFzaCBmdW5jdGlvbnMKK3VzYWdlX1Rvb2xGb3JEaWZmPVVzZSB0aGUgZGlmZiB0b29sIHNwZWNpZmllZCBieSA8dG9vbD4uIFJ1biBnaXQgZGlmZnRvb2wgLS10b29sLWhlbHAgZm9yIHRoZSBsaXN0IG9mIHZhbGlkIDx0b29sPiBzZXR0aW5ncy5cbklmIGEgZGlmZiB0b29sIGlzIG5vdCBzcGVjaWZpZWQsIGdpdCBkaWZmdG9vbCB3aWxsIHVzZSB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBkaWZmLnRvb2wuCiB1c2FnZV9VcGRhdGVSZW1vdGVSZXBvc2l0b3J5RnJvbUxvY2FsUmVmcz1VcGRhdGUgcmVtb3RlIHJlcG9zaXRvcnkgZnJvbSBsb2NhbCByZWZzCiB1c2FnZV9Vc2VBbGw9VXNlIGFsbCByZWZzIGZvdW5kIGluIHJlZnMvCiB1c2FnZV9Vc2VUYWdzPVVzZSBhbnkgdGFnIGluY2x1ZGluZyBsaWdodHdlaWdodCB0YWdzCkBAIC0zNDIsNiArMzUwLDcgQEAKIHVzYWdlX2RhdGU9ZGF0ZSBmb3JtYXQsIG9uZSBvZiBkZWZhdWx0LCByZmMsIGxvY2FsLCBpc28sIHNob3J0LCByYXcgKGFzIGRlZmluZWQgYnkgZ2l0LWxvZygxKSApLCBsb2NhbGUgb3IgbG9jYWxlbG9jYWwgKGpnaXQgZXh0ZW5zaW9ucykKIHVzYWdlX2RldGVjdFJlbmFtZXM9ZGV0ZWN0IHJlbmFtZWQgZmlsZXMKIHVzYWdlX2RpZmZBbGdvcml0aG09dGhlIGRpZmYgYWxnb3JpdGhtIHRvIHVzZS4gQ3VycmVudGx5IHN1cHBvcnRlZCBhcmU6ICdteWVycycsICdoaXN0b2dyYW0nCit1c2FnZV9EaWZmVG9vbD1naXQgZGlmZnRvb2wgaXMgYSBHaXQgY29tbWFuZCB0aGF0IGFsbG93cyB5b3UgdG8gY29tcGFyZSBhbmQgZWRpdCBmaWxlcyBiZXR3ZWVuIHJldmlzaW9ucyB1c2luZyBjb21tb24gZGlmZiB0b29scy5cbmdpdCBkaWZmdG9vbCBpcyBhIGZyb250ZW5kIHRvIGdpdCBkaWZmIGFuZCBhY2NlcHRzIHRoZSBzYW1lIG9wdGlvbnMgYW5kIGFyZ3VtZW50cy4KIHVzYWdlX2RpcmVjdG9yaWVzVG9FeHBvcnQ9ZGlyZWN0b3JpZXMgdG8gZXhwb3J0CiB1c2FnZV9kaXNhYmxlVGhlU2VydmljZUluQWxsUmVwb3NpdG9yaWVzPWRpc2FibGUgdGhlIHNlcnZpY2UgaW4gYWxsIHJlcG9zaXRvcmllcwogdXNhZ2VfZGlzcGxheUFMaXN0T2ZBbGxSZWdpc3RlcmVkSmdpdENvbW1hbmRzPURpc3BsYXkgYSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIGpnaXQgY29tbWFuZHMKQEAgLTM5Niw2ICs0MDUsOCBAQAogdXNhZ2VfcGVyZm9ybUZzY2tTdHlsZUNoZWNrc09uUmVjZWl2ZT1wZXJmb3JtIGZzY2sgc3R5bGUgY2hlY2tzIG9uIHJlY2VpdmUKIHVzYWdlX3BvcnROdW1iZXJUb0xpc3Rlbk9uPXBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbgogdXNhZ2VfcHJpbnRPbmx5QnJhbmNoZXNUaGF0Q29udGFpblRoZUNvbW1pdD1wcmludCBvbmx5IGJyYW5jaGVzIHRoYXQgY29udGFpbiB0aGUgY29tbWl0Cit1c2FnZV9wcm9tcHQ9UHJvbXB0IGJlZm9yZSBlYWNoIGludm9jYXRpb24gb2YgdGhlIGRpZmYgdG9vbC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvdXI7IHRoZSBvcHRpb24gaXMgcHJvdmlkZWQgdG8gb3ZlcnJpZGUgYW55IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCit1c2FnZV9ub1Byb21wdD1EbyBub3QgcHJvbXB0IGJlZm9yZSBsYXVuY2hpbmcgYSBkaWZmIHRvb2wuCiB1c2FnZV9wcnVuZVN0YWxlVHJhY2tpbmdSZWZzPXBydW5lIHN0YWxlIHRyYWNraW5nIHJlZnMKIHVzYWdlX3B1c2hVcmxzPXB1c2ggVVJMcyBhcmUgbWFuaXB1bGF0ZWQKIHVzYWdlX3F1aWV0PWRvbid0IHNob3cgcHJvZ3Jlc3MgbWVzc2FnZXMKQEAgLTQyMyw2ICs0MzQsOCBAQAogdXNhZ2Vfc3NoRHJpdmVyPVNlbGVjdHMgdGhlIGJ1aWx0LWluIHNzaCBsaWJyYXJ5IHRvIHVzZSwgSlNjaCBvciBBcGFjaGUgTUlOQSBzc2hkLgogdXNhZ2Vfc3ltYm9saWNWZXJzaW9uRm9yVGhlUHJvamVjdD1TeW1ib2xpYyB2ZXJzaW9uIGZvciB0aGUgcHJvamVjdAogdXNhZ2VfdGFncz1mZXRjaCBhbGwgdGFncwordXNhZ2VfdHJ1c3RFeGl0Q29kZT1naXQtZGlmZnRvb2wgaW52b2tlcyBhIGRpZmYgdG9vbCBpbmRpdmlkdWFsbHkgb24gZWFjaCBmaWxlLiBFcnJvcnMgcmVwb3J0ZWQgYnkgdGhlIGRpZmYgdG9vbCBhcmUgaWdub3JlZCBieSBkZWZhdWx0LiBVc2UgLS10cnVzdC1leGl0LWNvZGUgdG8gbWFrZSBnaXQtZGlmZnRvb2wgZXhpdCB3aGVuIGFuIGludm9rZWQgZGlmZiB0b29sIHJldHVybnMgYSBub24temVybyBleGl0IGNvZGUuXG5naXQtZGlmZnRvb2wgd2lsbCBmb3J3YXJkIHRoZSBleGl0IGNvZGUgb2YgdGhlIGludm9rZWQgdG9vbCB3aGVuIC0tdHJ1c3QtZXhpdC1jb2RlIGlzIHVzZWQuCit1c2FnZV9ub1RydXN0RXhpdENvZGU9VGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgLS10cnVzdC1leGl0LWNvZGUgc2V0dGluZy4KIHVzYWdlX25vdGFncz1kbyBub3QgZmV0Y2ggdGFncwogdXNhZ2VfdGFnQW5ub3RhdGVkPWNyZWF0ZSBhbiBhbm5vdGF0ZWQgdGFnLCB1bnNpZ25lZCB1bmxlc3MgLXMgb3IgLXUgYXJlIGdpdmVuLCBvciBjb25maWcgdGFnLmdwZ1NpZ24gaXMgdHJ1ZQogdXNhZ2VfdGFnRGVsZXRlPWRlbGV0ZSB0YWcKQEAgLTQzMSw2ICs0NDQsNyBAQAogdXNhZ2VfdGFnU2lnbj1jcmVhdGUgYSBzaWduZWQgYW5ub3RhdGVkIHRhZwogdXNhZ2VfdGFnTm9TaWduPXN1cHByZXNzIHNpZ25pbmcgdGhlIHRhZwogdXNhZ2VfdGFnVmVyaWZ5PVZlcmlmeSB0aGUgR1BHIHNpZ25hdHVyZQordXNhZ2VfdG9vbEhlbHA9UHJpbnQgYSBsaXN0IG9mIGRpZmYgdG9vbHMgdGhhdCBtYXkgYmUgdXNlZCB3aXRoIC0tdG9vbC4KIHVzYWdlX3VudHJhY2tlZEZpbGVzTW9kZT1zaG93IHVudHJhY2tlZCBmaWxlcwogdXNhZ2VfdXBkYXRlUmVmPXJlZmVyZW5jZSB0byB1cGRhdGUKIHVzYWdlX3VwZGF0ZVJlbW90ZVJlZnNGcm9tQW5vdGhlclJlcG9zaXRvcnk9VXBkYXRlIHJlbW90ZSByZWZzIGZyb20gYW5vdGhlciByZXBvc2l0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQmxhbWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9CbGFtZS5qYXZhCmluZGV4IDJiNDljZjcuLjFhM2EyZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9CbGFtZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9CbGFtZS5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiAKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkludGVnZXIudmFsdWVPZjsKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkxvbmcudmFsdWVPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTExNiw3ICsxMTcsOCBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB7CiAKIAkJYm9vbGVhbiBhdXRvQWJicmV2ID0gYWJicmV2ID09IDA7CiAJCWlmIChhYmJyZXYgPT0gMCkgewotCQkJYWJicmV2ID0gZGIuZ2V0Q29uZmlnKCkuZ2V0SW50KCJjb3JlIiwgImFiYnJldiIsIDcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCWFiYnJldiA9IGRiLmdldENvbmZpZygpLmdldEludCgiY29yZSIsICJhYmJyZXYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKTsKIAkJfQogCQlpZiAoIXNob3dCbGFua0JvdW5kYXJ5KSB7CiAJCQlyb290ID0gZGIuZ2V0Q29uZmlnKCkuZ2V0Qm9vbGVhbigiYmxhbWUiLCAiYmxhbmtib3VuZGFyeSIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGVzY3JpYmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EZXNjcmliZS5qYXZhCmluZGV4IDhhYTExOWEuLjExNmRiMDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EZXNjcmliZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EZXNjcmliZS5qYXZhCkBAIC00NCw2ICs0NCw5IEBAIGNsYXNzIERlc2NyaWJlIGV4dGVuZHMgVGV4dEJ1aWx0aW4gewogCUBPcHRpb24obmFtZSA9ICItLW1hdGNoIiwgdXNhZ2UgPSAidXNhZ2VfTWF0Y2giLCBtZXRhVmFyID0gIm1ldGFWYXJfcGF0dGVybiIpCiAJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAorCUBPcHRpb24obmFtZSA9ICItLWFiYnJldiIsIHVzYWdlID0gInVzYWdlX0FiYnJldiIpCisJcHJpdmF0ZSBJbnRlZ2VyIGFiYnJldjsKKwogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuKCkgewpAQCAtNTcsNiArNjAsOSBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB7CiAJCQljbWQuc2V0VGFncyh1c2VUYWdzKTsKIAkJCWNtZC5zZXRBbHdheXMoYWx3YXlzKTsKIAkJCWNtZC5zZXRNYXRjaChwYXR0ZXJucy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKKwkJCWlmIChhYmJyZXYgIT0gbnVsbCkgeworCQkJCWNtZC5zZXRBYmJyZXYoYWJicmV2LmludFZhbHVlKCkpOworCQkJfQogCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7CiAJCQl0cnkgewogCQkJCXJlc3VsdCA9IGNtZC5jYWxsKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZlRvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODg4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZlRvb2wuamF2YQpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIxLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuSEVBRDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRm9ybWF0dGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5BbWJpZ3VvdXNPYmplY3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXZpc2lvblN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2wuRGlmZlRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbC5FeHRlcm5hbERpZmZUb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdFJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlRleHRQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWwuQm9vbGVhblRyaVN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsLkNMSVRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LlBhdGhUcmVlRmlsdGVySGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkFic3RyYWN0VHJlZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuQ2Fub25pY2FsVHJlZVBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuVHJlZUZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkFyZ3VtZW50OworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CisKK0BDb21tYW5kKG5hbWUgPSAiZGlmZnRvb2wiLCBjb21tb24gPSB0cnVlLCB1c2FnZSA9ICJ1c2FnZV9EaWZmVG9vbCIpCitjbGFzcyBEaWZmVG9vbCBleHRlbmRzIFRleHRCdWlsdGluIHsKKwlwcml2YXRlIERpZmZGb3JtYXR0ZXIgZGlmZkZtdDsKKworCXByaXZhdGUgRGlmZlRvb2xzIGRpZmZUb29sczsKKworCUBBcmd1bWVudChpbmRleCA9IDAsIG1ldGFWYXIgPSAibWV0YVZhcl90cmVlaXNoIikKKwlwcml2YXRlIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG9sZFRyZWU7CisKKwlAQXJndW1lbnQoaW5kZXggPSAxLCBtZXRhVmFyID0gIm1ldGFWYXJfdHJlZWlzaCIpCisJcHJpdmF0ZSBBYnN0cmFjdFRyZWVJdGVyYXRvciBuZXdUcmVlOworCisJQE9wdGlvbihuYW1lID0gIi0tdG9vbCIsIGFsaWFzZXMgPSB7CisJCQkiLXQiIH0sIG1ldGFWYXIgPSAibWV0YVZhcl90b29sIiwgdXNhZ2UgPSAidXNhZ2VfVG9vbEZvckRpZmYiKQorCXByaXZhdGUgU3RyaW5nIHRvb2xOYW1lOworCisJQE9wdGlvbihuYW1lID0gIi0tY2FjaGVkIiwgYWxpYXNlcyA9IHsgIi0tc3RhZ2VkIiB9LCB1c2FnZSA9ICJ1c2FnZV9jYWNoZWQiKQorCXByaXZhdGUgYm9vbGVhbiBjYWNoZWQ7CisKKwlwcml2YXRlIEJvb2xlYW5UcmlTdGF0ZSBwcm9tcHQgPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQ7CisKKwlAT3B0aW9uKG5hbWUgPSAiLS1wcm9tcHQiLCB1c2FnZSA9ICJ1c2FnZV9wcm9tcHQiKQorCXZvaWQgc2V0UHJvbXB0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIG9uKSB7CisJCXByb21wdCA9IEJvb2xlYW5UcmlTdGF0ZS5UUlVFOworCX0KKworCUBPcHRpb24obmFtZSA9ICItLW5vLXByb21wdCIsIGFsaWFzZXMgPSB7ICIteSIgfSwgdXNhZ2UgPSAidXNhZ2Vfbm9Qcm9tcHQiKQorCXZvaWQgbm9Qcm9tcHQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gb24pIHsKKwkJcHJvbXB0ID0gQm9vbGVhblRyaVN0YXRlLkZBTFNFOworCX0KKworCUBPcHRpb24obmFtZSA9ICItLXRvb2wtaGVscCIsIHVzYWdlID0gInVzYWdlX3Rvb2xIZWxwIikKKwlwcml2YXRlIGJvb2xlYW4gdG9vbEhlbHA7CisKKwlwcml2YXRlIEJvb2xlYW5UcmlTdGF0ZSBndWkgPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQ7CisKKwlAT3B0aW9uKG5hbWUgPSAiLS1ndWkiLCBhbGlhc2VzID0geyAiLWciIH0sIHVzYWdlID0gInVzYWdlX0RpZmZHdWlUb29sIikKKwl2b2lkIHNldEd1aShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBvbikgeworCQlndWkgPSBCb29sZWFuVHJpU3RhdGUuVFJVRTsKKwl9CisKKwlAT3B0aW9uKG5hbWUgPSAiLS1uby1ndWkiLCB1c2FnZSA9ICJ1c2FnZV9ub0d1aSIpCisJdm9pZCBub0d1aShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBvbikgeworCQlndWkgPSBCb29sZWFuVHJpU3RhdGUuRkFMU0U7CisJfQorCisJcHJpdmF0ZSBCb29sZWFuVHJpU3RhdGUgdHJ1c3RFeGl0Q29kZSA9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVDsKKworCUBPcHRpb24obmFtZSA9ICItLXRydXN0LWV4aXQtY29kZSIsIHVzYWdlID0gInVzYWdlX3RydXN0RXhpdENvZGUiKQorCXZvaWQgc2V0VHJ1c3RFeGl0Q29kZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBvbikgeworCQl0cnVzdEV4aXRDb2RlID0gQm9vbGVhblRyaVN0YXRlLlRSVUU7CisJfQorCisJQE9wdGlvbihuYW1lID0gIi0tbm8tdHJ1c3QtZXhpdC1jb2RlIiwgdXNhZ2UgPSAidXNhZ2Vfbm9UcnVzdEV4aXRDb2RlIikKKwl2b2lkIG5vVHJ1c3RFeGl0Q29kZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBvbikgeworCQl0cnVzdEV4aXRDb2RlID0gQm9vbGVhblRyaVN0YXRlLkZBTFNFOworCX0KKworCUBPcHRpb24obmFtZSA9ICItLSIsIG1ldGFWYXIgPSAibWV0YVZhcl9wYXRocyIsIGhhbmRsZXIgPSBQYXRoVHJlZUZpbHRlckhhbmRsZXIuY2xhc3MpCisJcHJpdmF0ZSBUcmVlRmlsdGVyIHBhdGhGaWx0ZXIgPSBUcmVlRmlsdGVyLkFMTDsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXQoUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcgZ2l0RGlyKSB7CisJCXN1cGVyLmluaXQocmVwb3NpdG9yeSwgZ2l0RGlyKTsKKwkJZGlmZkZtdCA9IG5ldyBEaWZmRm9ybWF0dGVyKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvdXRzKSk7CisJCWRpZmZUb29scyA9IG5ldyBEaWZmVG9vbHMocmVwb3NpdG9yeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgcnVuKCkgeworCQl0cnkgeworCQkJaWYgKHRvb2xIZWxwKSB7CisJCQkJc2hvd1Rvb2xIZWxwKCk7CisJCQl9IGVsc2UgeworCQkJCWJvb2xlYW4gc2hvd1Byb21wdCA9IGRpZmZUb29scy5pc0ludGVyYWN0aXZlKCk7CisJCQkJaWYgKHByb21wdCAhPSBCb29sZWFuVHJpU3RhdGUuVU5TRVQpIHsKKwkJCQkJc2hvd1Byb21wdCA9IHByb21wdCA9PSBCb29sZWFuVHJpU3RhdGUuVFJVRTsKKwkJCQl9CisJCQkJU3RyaW5nIHRvb2xOYW1lUHJvbXB0ID0gdG9vbE5hbWU7CisJCQkJaWYgKHNob3dQcm9tcHQpIHsKKwkJCQkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwodG9vbE5hbWVQcm9tcHQpKSB7CisJCQkJCQl0b29sTmFtZVByb21wdCA9IGRpZmZUb29scy5nZXREZWZhdWx0VG9vbE5hbWUoZ3VpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBnZXQgdGhlIGNoYW5nZWQgZmlsZXMKKwkJCQlMaXN0PERpZmZFbnRyeT4gZmlsZXMgPSBnZXRGaWxlcygpOworCQkJCWlmIChmaWxlcy5zaXplKCkgPiAwKSB7CisJCQkJCWNvbXBhcmUoZmlsZXMsIHNob3dQcm9tcHQsIHRvb2xOYW1lUHJvbXB0KTsKKwkJCQl9CisJCQl9CisJCQlvdXR3LmZsdXNoKCk7CisJCX0gY2F0Y2ggKFJldmlzaW9uU3ludGF4RXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgZGllKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWRpZmZGbXQuY2xvc2UoKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjb21wYXJlKExpc3Q8RGlmZkVudHJ5PiBmaWxlcywgYm9vbGVhbiBzaG93UHJvbXB0LAorCQkJU3RyaW5nIHRvb2xOYW1lUHJvbXB0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmb3IgKGludCBmaWxlSW5kZXggPSAwOyBmaWxlSW5kZXggPCBmaWxlcy5zaXplKCk7IGZpbGVJbmRleCsrKSB7CisJCQlEaWZmRW50cnkgZW50ID0gZmlsZXMuZ2V0KGZpbGVJbmRleCk7CisJCQlTdHJpbmcgbWVyZ2VkRmlsZVBhdGggPSBlbnQuZ2V0TmV3UGF0aCgpOworCQkJaWYgKG1lcmdlZEZpbGVQYXRoLmVxdWFscyhEaWZmRW50cnkuREVWX05VTEwpKSB7CisJCQkJbWVyZ2VkRmlsZVBhdGggPSBlbnQuZ2V0T2xkUGF0aCgpOworCQkJfQorCQkJLy8gY2hlY2sgaWYgdXNlciB3YW50cyB0byBsYXVuY2ggY29tcGFyZQorCQkJYm9vbGVhbiBsYXVuY2hDb21wYXJlID0gdHJ1ZTsKKwkJCWlmIChzaG93UHJvbXB0KSB7CisJCQkJbGF1bmNoQ29tcGFyZSA9IGlzTGF1bmNoQ29tcGFyZShmaWxlSW5kZXggKyAxLCBmaWxlcy5zaXplKCksCisJCQkJCQltZXJnZWRGaWxlUGF0aCwgdG9vbE5hbWVQcm9tcHQpOworCQkJfQorCQkJaWYgKGxhdW5jaENvbXBhcmUpIHsKKwkJCQlzd2l0Y2ggKGVudC5nZXRDaGFuZ2VUeXBlKCkpIHsKKwkJCQljYXNlIE1PRElGWToKKwkJCQkJb3V0dy5wcmludGxuKCJNXHQiICsgZW50LmdldE5ld1BhdGgoKSAvLyROT04tTkxTLTEkCisJCQkJCQkJKyAiICgiICsgZW50LmdldE5ld0lkKCkubmFtZSgpICsgIikiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCSsgIlx0IiArIGVudC5nZXRPbGRQYXRoKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCSsgIiAoIiArIGVudC5nZXRPbGRJZCgpLm5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlpbnQgcmV0ID0gZGlmZlRvb2xzLmNvbXBhcmUoZW50LmdldE5ld1BhdGgoKSwKKwkJCQkJCQllbnQuZ2V0T2xkUGF0aCgpLCBlbnQuZ2V0TmV3SWQoKS5uYW1lKCksCisJCQkJCQkJZW50LmdldE9sZElkKCkubmFtZSgpLCB0b29sTmFtZSwgcHJvbXB0LCBndWksCisJCQkJCQkJdHJ1c3RFeGl0Q29kZSk7CisJCQkJCWlmIChyZXQgIT0gMCkgeworCQkJCQkJdGhyb3cgZGllKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCQlDTElUZXh0LmdldCgpLmRpZmZUb29sRGllZCwgbWVyZ2VkRmlsZVBhdGgpKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCisJcHJpdmF0ZSBib29sZWFuIGlzTGF1bmNoQ29tcGFyZShpbnQgZmlsZUluZGV4LCBpbnQgZmlsZUNvdW50LAorCQkJU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgdG9vbE5hbWVQcm9tcHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWJvb2xlYW4gbGF1bmNoQ29tcGFyZSA9IHRydWU7CisJCW91dHcucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLmRpZmZUb29sTGF1bmNoLAorCQkJCWZpbGVJbmRleCwgZmlsZUNvdW50LCBmaWxlTmFtZSwgdG9vbE5hbWVQcm9tcHQpKTsKKwkJb3V0dy5mbHVzaCgpOworCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5zLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisJCVN0cmluZyBsaW5lID0gbnVsbDsKKwkJaWYgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkJaWYgKCFsaW5lLmVxdWFsc0lnbm9yZUNhc2UoIlkiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJbGF1bmNoQ29tcGFyZSA9IGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiBsYXVuY2hDb21wYXJlOworCX0KKworCXByaXZhdGUgdm9pZCBzaG93VG9vbEhlbHAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmdCdWlsZGVyIGF2YWlsYWJsZVRvb2xOYW1lcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWZvciAoU3RyaW5nIG5hbWUgOiBkaWZmVG9vbHMuZ2V0QXZhaWxhYmxlVG9vbHMoKS5rZXlTZXQoKSkgeworCQkJYXZhaWxhYmxlVG9vbE5hbWVzLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJcdFx0JXNcbiIsIG5hbWUpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCVN0cmluZ0J1aWxkZXIgbm90QXZhaWxhYmxlVG9vbE5hbWVzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IGRpZmZUb29scy5nZXROb3RBdmFpbGFibGVUb29scygpLmtleVNldCgpKSB7CisJCQlub3RBdmFpbGFibGVUb29sTmFtZXMuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlx0XHQlc1xuIiwgbmFtZSkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJU3RyaW5nQnVpbGRlciB1c2VyVG9vbE5hbWVzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gdXNlclRvb2xzID0gZGlmZlRvb2xzCisJCQkJLmdldFVzZXJEZWZpbmVkVG9vbHMoKTsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IHVzZXJUb29scy5rZXlTZXQoKSkgeworCQkJdXNlclRvb2xOYW1lcy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiXHRcdCVzLmNtZCAlc1xuIiwgLy8kTk9OLU5MUy0xJAorCQkJCQluYW1lLCB1c2VyVG9vbHMuZ2V0KG5hbWUpLmdldENvbW1hbmQoKSkpOworCQl9CisJCW91dHcucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQlDTElUZXh0LmdldCgpLmRpZmZUb29sSGVscFNldFRvRm9sbG93aW5nLCBhdmFpbGFibGVUb29sTmFtZXMsCisJCQkJdXNlclRvb2xOYW1lcywgbm90QXZhaWxhYmxlVG9vbE5hbWVzKSk7CisJfQorCisJcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZ2V0RmlsZXMoKQorCQkJdGhyb3dzIFJldmlzaW9uU3ludGF4RXhjZXB0aW9uLCBBbWJpZ3VvdXNPYmplY3RFeGNlcHRpb24sCisJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWRpZmZGbXQuc2V0UmVwb3NpdG9yeShkYik7CisJCWlmIChjYWNoZWQpIHsKKwkJCWlmIChvbGRUcmVlID09IG51bGwpIHsKKwkJCQlPYmplY3RJZCBoZWFkID0gZGIucmVzb2x2ZShIRUFEICsgIl57dHJlZX0iKTsgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChoZWFkID09IG51bGwpIHsKKwkJCQkJZGllKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENMSVRleHQuZ2V0KCkubm90QVRyZWUsIEhFQUQpKTsKKwkJCQl9CisJCQkJQ2Fub25pY2FsVHJlZVBhcnNlciBwID0gbmV3IENhbm9uaWNhbFRyZWVQYXJzZXIoKTsKKwkJCQl0cnkgKE9iamVjdFJlYWRlciByZWFkZXIgPSBkYi5uZXdPYmplY3RSZWFkZXIoKSkgeworCQkJCQlwLnJlc2V0KHJlYWRlciwgaGVhZCk7CisJCQkJfQorCQkJCW9sZFRyZWUgPSBwOworCQkJfQorCQkJbmV3VHJlZSA9IG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRiLnJlYWREaXJDYWNoZSgpKTsKKwkJfSBlbHNlIGlmIChvbGRUcmVlID09IG51bGwpIHsKKwkJCW9sZFRyZWUgPSBuZXcgRGlyQ2FjaGVJdGVyYXRvcihkYi5yZWFkRGlyQ2FjaGUoKSk7CisJCQluZXdUcmVlID0gbmV3IEZpbGVUcmVlSXRlcmF0b3IoZGIpOworCQl9IGVsc2UgaWYgKG5ld1RyZWUgPT0gbnVsbCkgeworCQkJbmV3VHJlZSA9IG5ldyBGaWxlVHJlZUl0ZXJhdG9yKGRiKTsKKwkJfQorCisJCVRleHRQcm9ncmVzc01vbml0b3IgcG0gPSBuZXcgVGV4dFByb2dyZXNzTW9uaXRvcihlcnJ3KTsKKwkJcG0uc2V0RGVsYXlTdGFydCgyLCBUaW1lVW5pdC5TRUNPTkRTKTsKKwkJZGlmZkZtdC5zZXRQcm9ncmVzc01vbml0b3IocG0pOworCQlkaWZmRm10LnNldFBhdGhGaWx0ZXIocGF0aEZpbHRlcik7CisKKwkJTGlzdDxEaWZmRW50cnk+IGZpbGVzID0gZGlmZkZtdC5zY2FuKG9sZFRyZWUsIG5ld1RyZWUpOworCQlyZXR1cm4gZmlsZXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZS5qYXZhCmluZGV4IGNhNDg3N2YuLjI3YTNkOTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZS5qYXZhCkBAIC0xMCw2ICsxMCw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTE0NCw4ICsxNDYsMTAgQEAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgewogCQkJY2FzZSBGQVNUX0ZPUldBUkQ6CiAJCQkJT2JqZWN0SWQgb2xkSGVhZElkID0gb2xkSGVhZC5nZXRPYmplY3RJZCgpOwogCQkJCWlmIChvbGRIZWFkSWQgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkSWQgPSBvbGRIZWFkSWQuYWJicmV2aWF0ZSg3KS5uYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdJZCA9IHJlc3VsdC5nZXROZXdIZWFkKCkuYWJicmV2aWF0ZSg3KS5uYW1lKCk7CisJCQkJCVN0cmluZyBvbGRJZCA9IG9sZEhlYWRJZAorCQkJCQkJCS5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkubmFtZSgpOworCQkJCQlTdHJpbmcgbmV3SWQgPSByZXN1bHQuZ2V0TmV3SGVhZCgpCisJCQkJCQkJLmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKS5uYW1lKCk7CiAJCQkJCW91dHcucHJpbnRsbihNZXNzYWdlRm9ybWF0LmZvcm1hdChDTElUZXh0LmdldCgpLnVwZGF0aW5nLAogCQkJCQkJCW9sZElkLCBuZXdJZCkpOwogCQkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZWZsb2cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZWZsb2cuamF2YQppbmRleCAwMzAxMTllLi5jNjM1MzJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmVmbG9nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlZmxvZy5qYXZhCkBAIC05LDYgKzksOCBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCkBAIC00NSw3ICs0Nyw4IEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHsKIAogCXByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKFJlZmxvZ0VudHJ5IGVudHJ5LCBpbnQgaSkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzLmFwcGVuZChlbnRyeS5nZXROZXdJZCgpLmFiYnJldmlhdGUoNykubmFtZSgpKTsKKwkJcy5hcHBlbmQoZW50cnkuZ2V0TmV3SWQoKS5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkKKwkJCQkubmFtZSgpKTsKIAkJcy5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAogCQlzLmFwcGVuZChyZWYgPT0gbnVsbCA/IENvbnN0YW50cy5IRUFEIDogUmVwb3NpdG9yeS5zaG9ydGVuUmVmTmFtZShyZWYpKTsKIAkJcy5hcHBlbmQoIkB7IiArIGkgKyAifToiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQuamF2YQppbmRleCA4ZTQ5YTc2Li43ZmU1YjBmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LmphdmEKQEAgLTEzNiw2ICsxMzYsOSBAQCBwdWJsaWMgc3RhdGljIFN0cmluZyBmYXRhbEVycm9yKFN0cmluZyBtZXNzYWdlKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkYXRlSW5mbzsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRlbGV0ZWRCcmFuY2g7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkZWxldGVkUmVtb3RlQnJhbmNoOworCS8qKiovIHB1YmxpYyBTdHJpbmcgZGlmZlRvb2xIZWxwU2V0VG9Gb2xsb3dpbmc7CisJLyoqKi8gcHVibGljIFN0cmluZyBkaWZmVG9vbExhdW5jaDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGRpZmZUb29sRGllZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRvZXNOb3RFeGlzdDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRvbnRPdmVyd3JpdGVMb2NhbENoYW5nZXM7CiAJLyoqKi8gcHVibGljIFN0cmluZyBldmVyeXRoaW5nVXBUb0RhdGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvQlVJTEQgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvQlVJTEQKaW5kZXggMGM4Y2Y4My4uZjJlNGQ1NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L0JVSUxECisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9CVUlMRApAQCAtMTcsNiArMTcsNiBAQAogICAgICAgICAiLy9saWI6c2xmNGotYXBpIiwKICAgICAgICAgIi8vbGliOnNzaGQtb3NnaSIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQ6amdpdCIsCi0gICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZTpzc2gtYXBhY2hlIgorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGU6c3NoLWFwYWNoZSIsCiAgICAgXSwKICkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAzZmQwZjUyLi4xYTU3NDZkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0yLDE1ICsyLDE1IEBACiBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQ7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlO2J1bmRsZS12ZXJzaW9uPSJbNi4wLjEsNi4xLjApIgorRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlO2J1bmRsZS12ZXJzaW9uPSJbNi4xLjEsNi4yLjApIgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIgogUmVxdWlyZS1CdW5kbGU6IGNvbS5zdW4uam5hO2J1bmRsZS12ZXJzaW9uPSJbNS44LjAsNi4wLjApIiwKICBjb20uc3VuLmpuYS5wbGF0Zm9ybTtidW5kbGUtdmVyc2lvbj0iWzUuOC4wLDYuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50LmNvbm5lY3Rvcjt2ZXJzaW9uPSI2LjAuMSI7eC1pbnRlcm5hbDo9dHJ1ZQorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYWdlbnQuY29ubmVjdG9yO3ZlcnNpb249IjYuMS4xIjt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCA4MDhkZTUzLi5kMDZlNmIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50IC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50LnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50O3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50O3ZlcnNpb249IjYuMS4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvUkVBRE1FLm1kIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDYyYTJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L1JFQURNRS5tZApAQCAtMCwwICsxLDgyIEBACisjIEpHaXQgU1NIIGFnZW50IHRyYW5zcG9ydCBzdXBwb3J0IGZvciBBcGFjaGUgTUlOQSBzc2hkCisKK1RoaXMgYnVuZGxlIHByb3ZpZGVzIG9wdGlvbmFsIHN1cHBvcnQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBhbiBTU0ggYWdlbnQKK2ZvciBTU0ggb3IgU0ZUUCBhdXRoZW50aWNhdGlvbi4gSXQgaXMgYW4gT1NHaSBmcmFnbWVudCBmb3IgYnVuZGxlCitbb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlXSguLi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvUkVBRE1FLm1kKSwKK2FuZCBpdCBwcm92aWRlcyB0cmFuc3BvcnRzIGZvciBsb2NhbCBjb21tdW5pY2F0aW9uIHdpdGggU1NIIGFnZW50cy4KKworIyMgU3VwcG9ydGVkIFNTSCBhZ2VudCB0cmFuc3BvcnRzCisKKyMjIyBMaW51eCwgT1MgWCwgQlNECisKK09uIExpbnV4LCBPUyBYLCBhbmQgQlNELCB0aGUgb25seSB0cmFuc3BvcnQgbWVjaGFuaXNtIHN1cHBvcnRlZCBpcyB0aGUgdXN1YWwKK2NvbW11bmljYXRpb24gdmlhIGEgVW5peCBkb21haW4gc29ja2V0LiBUaGlzIGlzIHRoZSBvbmx5IHByb3RvY29sIHRoZSBPcGVuU1NICitTU0ggYWdlbnQgc3VwcG9ydHMuIEEgVW5peCBkb21haW4gc29ja2V0IGFwcGVhcnMgYXMgYSBzcGVjaWFsIGZpbGUgaW4gdGhlIGZpbGUKK3N5c3RlbTsgdGhpcyBmaWxlIG5hbWUgaXMgdHlwaWNhbGx5IGF2YWlsYWJsZSBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKK2BTU0hfQVVUSF9TT0NLYC4KKworVGhlIFNTSCBjb25maWcgYElkZW50aXR5QWdlbnRgIGNhbiBiZSBzZXQgdG8gdGhpcyBzb2NrZXQgZmlsZW5hbWUgdG8gc3BlY2lmeQorZXhhY3RseSB3aGljaCBVbml4IGRvbWFpbiBzb2NrZXQgdG8gdXNlLCBvciBpdCBjYW4gYmUgc2V0IHRvIGBTU0hfQVVUSF9TT0NLYAordG8gdXNlIHRoZSB2YWx1ZSBmcm9tIHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUuIElmIGBJZGVudGl0eUFnZW50YCBpcyBub3Qgc2V0CithdCBhbGwsIEpHaXQgdXNlcyBgU1NIX0FVVEhfU09DS2AgYnkgZGVmYXVsdC4gSWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBzZXQsIG5vCitTU0ggYWdlbnQgd2lsbCBiZSB1c2VkLiBgSWRlbnRpdHlBZ2VudGAgY2FuIGFsc28gYmUgc2V0IHRvIGBub25lYCB0byBub3QgdXNlCithbnkgU1NIIGFnZW50LgorCisjIyMgV2luZG93cworCitPbiBXaW5kb3dzLCB0d28gZGlmZmVyZW50IHRyYW5zcG9ydHMgYXJlIHN1cHBvcnRlZDoKKworKiBBIHRyYW5zcG9ydCBvdmVyIGEgV2luZG93cyBuYW1lZCBwaXBlLiBUaGlzIGlzIHVzZWQgYnkgV2luMzItT3BlblNTSCwgYW5kIGlzIGF2YWlsYWJsZSBmb3IgUGFnZWFudCBzaW5jZSB2ZXJzaW9uIDAuNzUuCisqIEEgUGFnZWFudC1zcGVjaWZpYyBsZWdhY3kgdHJhbnNwb3J0IHZpYSBzaGFyZWQgbWVtb3J5OyB1c2VmdWwgZm9yIFBhZ2VhbnQgYW5kIEdQRydzIGdwZy1hZ2VudC4KKworUG9zc2libGUgc2V0dGluZ3Mgb2YgYElkZW50aXR5QWdlbnRgIHRvIHNlbGVjdCBhIHBhcnRpY3VsYXIgdHJhbnNwb3J0IGFyZQorCisqIGAvLy4vcGlwZS9vcGVuc3NoLXNzaC1hZ2VudGA6IHRoZSBXaW5kb3dzIG5hbWVkIHBpcGUgb2YgV2luMzItT3BlblNTSC4KKyogYC8vLi9wYWdlYW50YDogdGhlIHNoYXJlZC1tZW1vcnkgbWVjaGFuaXNtIG9mIFBhZ2VhbnQuCisqIGBub25lYDogZG8gbm90IHVzZSBhbnkgU1NIIGFnZW50LgorKiBgLy8uL3BpcGUvJmx0O2FueV92YWxpZF9waXBlX25hbWU+YDogdXNlIGEgc3BlY2lmaWMgV2luZG93cyBuYW1lZCBwaXBlLgorCitUaGUgZGVmYXVsdCB0cmFuc3BvcnQgb24gV2luZG93cyBpZiBgSWRlbnRpdHlBZ2VudGAgaXMgbm90IHNldCBhdCBhbGwgaXMgdGhlCitQYWdlYW50IHNoYXJlZC1tZW1vcnkgdHJhbnNwb3J0LiBFbnZpcm9ubWVudCB2YXJpYWJsZSBgU1NIX0FVVEhfU09DS2AgbmVlZHMKK25vdCBiZSBzZXQgZm9yIFBhZ2VhbnQsIGFuZCBfbXVzdCBub3RfIGJlIHNldCBmb3IgV2luMzItT3BlblNTSC4KKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UgYSBuYW1lZCBwaXBlIGFzIHRyYW5zcG9ydCBmb3IgUGFnZWFudCAoYXMgb2YKK3ZlcnNpb24gMC43NSkuIFVuZm9ydHVuYXRlbHksIFBhZ2VhbnQgdW5uZWNlc3NhcmlseSBjcnlwdG9ncmFwaGljYWxseQorb2JmdXNjYXRlcyB0aGUgcGlwZSBuYW1lLCBzbyBpdCBpcyBub3QgcG9zc2libGUgZm9yIEpHaXQgdG8gZGV0ZXJtaW5lIGl0CithdXRvbWF0aWNhbGx5LiBUaGUgcGlwZSBuYW1lIGlzIGBwYWdlYW50Ljx1c2VyIG5hbWU+LjxzaGEyNTY+YCwgZm9yIGluc3RhbmNlCitgcGFnZWFudC5teXNlbGYuYzU2ODc3MzZiYTc1NWE3MGIwMDA5NTVjYjE5MTY5OGFlZDdkYjIyMWMyYjA3MTAxOTllYjFmNTI5ODkyMmFiNWAuCitBIHVzZXIgY2FuIGxvb2sgdXAgdGhlIG5hbWUgYnkgc3RhcnRpbmcgUGFnZWFudCBhbmQgdGhlbiBydW5uaW5nIHRoZQorY29tbWFuZCBgZGlyIFxcLlxwaXBlXFxgIGluIGEgY29tbWFuZCBzaGVsbC4gT25jZSB0aGUgbmFtZSBpcyBrbm93biwgc2V0dGluZworYElkZW50aXR5QWdlbnRgIHRvIHRoZSBwaXBlIG5hbWUgYXMKK2AvLy4vcGlwZS9wYWdlYW50Lm15c2VsZi5jNTY4NzczNmJhNzU1YTcwYjAwMDk1NWNiMTkxNjk4YWVkN2RiMjIxYzJiMDcxMDE5OWViMWY1Mjk4OTIyYWI1YAorbWFrZXMgSkdpdCB1c2UgdGhpcyBXaW5kb3dzIG5hbWVkIHBpcGUgZm9yIGNvbW11bmljYXRpb24gd2l0aCBQYWdlYW50LgorCisoWW91IGNhbiB1c2UgZm9yd2FyZCBzbGFzaGVzIGluIHRoZSBgfi8uc3NoL2NvbmZpZ2AgZmlsZS4gU1NIIGNvbmZpZyBmaWxlCitwYXJzaW5nIGhhcyBpdHMgb3duIHJ1bGVzIGFib3V0IGJhY2tzbGFzaGVzIGluIGNvbmZpZyBmaWxlczsgd2hpY2ggYXJlCit0cmVhdGVkIGFzIGVzY2FwZSBjaGFyYWN0ZXJzIGluIHNvbWUgY29udGV4dHMuIFdpdGggYmFja3NsYXNoZXMgb25lIHdvdWxkCitoYXZlIHRvIHdyaXRlLCBlLmcuLCBgXFxcXC5ccGlwZVxvcGVuc3NoLXNzaC1hZ2VudGAuKQorCitXaXRoIHRoZXNlIHR3byB0cmFuc3BvcnQgbWVjaGFuaXNtcywgUGFnZWFudCBhbmQgV2luMzItT3BlblNTSCBhcmUgc3VwcG9ydGVkLgorQXMgZm9yIEdQRzogdGhlIGdwZy1hZ2VudCBjYW4gYmUgY29uZmlndXJlZCB0byBlbXVsYXRlIHNzaC1hZ2VudCAocHJlc3VtYWJseQordmlhIGEgV2luU29ja2V0czIgIlVuaXggZG9tYWluIHNvY2tldCIgb24gV2luZG93cykgb3IgdG8gZW11bGF0ZSBQYWdlYW50CisodXNpbmcgdGhlIHNoYXJlZCBtZW1vcnkgbWVjaGFuaXNtKS4gUnVubmluZyBncGctYWdlbnQgd2l0aCB0aGUKK2BlbmFibGUtc3NoLXN1cHBvcnRgIG9wdGlvbiBpcworW3JlcG9ydGVkIG5vdCB0byB3b3JrIG9uIFdpbmRvd3NdKGh0dHBzOi8vZGV2LmdudXBnLm9yZy9UMzg4MyksIHRob3VnaC4gQnV0Cit0aGUgUHVUVFkgZW11bGF0aW9uIGluIGdwZy1hZ2VudCAob3B0aW9uIGBlbmFibGUtcHV0dHktc3VwcG9ydGApIF9zaG91bGRfIHdvcmssCitzbyBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gdXNlIGdwZy1hZ2VudCBpbnN0ZWFkIG9mIFBhZ2VhbnQuCisKK05laXRoZXIgUGFnZWFudCAoYXMgb2YgdmVyc2lvbiAwLjc2KSBub3IgV2luMzItT3BlblNTSCAoYXMgb2YgdmVyc2lvbiA4LjYpCitzdXBwb3J0IHRoZSBgY29uZmlybWAgb3IgbGlmZXRpbWUgY29uc3RyYWludHMgZm9yIGBBZGRLZXlzVG9BZ2VudGAuIGdwZy1hZ2VudAorYXBwYXJlbnRseSBkb2VzLCBldmVuIHdoZW4gY29tbXVuaWNhdGluZyBvdmVyIHRoZSBQYWdlYW50IHNoYXJlZCBtZW1vcnkKK21lY2hhbmlzbS4KKworVGhlIHNzaC1hZ2VudCBmcm9tIGdpdCBiYXNoIG9uIFdpbmRvd3MgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuIEl0IHdvdWxkCituZWVkIGEgY29ubmVjdG9yIGhhbmRsaW5nIEN5Z3dpbiBzb2NrZXQgZmlsZXMgYW5kIHRoZSBDeWd3aW4gaGFuZHNoYWtlIG92ZXIKK2EgVENQIHN0cmVhbSBzb2NrZXQgYm91bmQgdG8gdGhlIGxvb3BiYWNrIGludGVyZmFjZS4gVGhlIEN5Z3dpbiBzb2NrZXQgZmlsZQorX2lzXyBleHBvc2VkIGluIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtIGF0ICVURU1QJVxzc2gtWFhYWFhYWFhYWFxhZ2VudC4mbHQ7bnVtYmVyPiwKK2J1dCBpdCBkb2VzIG5vdCBoYXZlIGEgZml4ZWQgbmFtZSAodGhlIFgncyBhbmQgdGhlIG51bWJlciBhcmUgdmFyaWFibGUgYW5kCitjaGFuZ2UgZWFjaCB0aW1lIHNzaC1hZ2VudCBpcyBzdGFydGVkKS4KKworIyMgSW1wbGVtZW50YXRpb24KKworVGhlIGltcGxlbWVudGF0aW9uIG9mIGFsbCB0cmFuc3BvcnRzIHVzZXMgSk5BLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3BvbS54bWwKaW5kZXggMWJkM2ZhZC4uNzdiOWM5NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQ8L2FydGlmYWN0SWQ+CkBAIC0xMzIsNyArMTMyLDYgQEAKICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CiAKLSAgICAgIDwhLS0gTmV3IGluIDYuMDsgdW5jb21tZW50IGluIDYuMQogICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLnNpb203OS5qYXBpY21wPC9ncm91cElkPgogICAgICAgICAgIDxhcnRpZmFjdElkPmphcGljbXAtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgpAQCAtMTU1LDYgKzE1NCw5IEBACiAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CiAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmVjbGlwc2UuamdpdC4qPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qLmludGVybmFsLio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgogICAgICAgICAgICAgICAgICAgPGFjY2Vzc01vZGlmaWVyPnB1YmxpYzwvYWNjZXNzTW9kaWZpZXI+CiAgICAgICAgICAgICAgICAgICA8YnJlYWtCdWlsZE9uTW9kaWZpY2F0aW9ucz5mYWxzZTwvYnJlYWtCdWlsZE9uTW9kaWZpY2F0aW9ucz4KICAgICAgICAgICAgICAgICAgIDxicmVha0J1aWxkT25CaW5hcnlJbmNvbXBhdGlibGVNb2RpZmljYXRpb25zPmZhbHNlPC9icmVha0J1aWxkT25CaW5hcnlJbmNvbXBhdGlibGVNb2RpZmljYXRpb25zPgpAQCAtMTc0LDExICsxNzYsOSBAQAogICAgICAgICAgIDwvZXhlY3V0aW9uPgogICAgICAgICA8L2V4ZWN1dGlvbnM+CiAgICAgICA8L3BsdWdpbj4KLSAgICAgIC0tPgogICAgIDwvcGx1Z2lucz4KICAgPC9idWlsZD4KIAotICA8IS0tIE5ldyBpbiA2LjAsIHVuY29tbWVudCBpbiA2LjEKICAgPHJlcG9ydGluZz4KICAgICA8cGx1Z2lucz4KICAgICAgIDxwbHVnaW4+CkBAIC0yMTAsNiArMjEwLDkgQEAKICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuZWNsaXBzZS5qZ2l0Lio8L2luY2x1ZGU+CiAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPiouaW50ZXJuYWwuKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CiAgICAgICAgICAgICAgICAgICA8YWNjZXNzTW9kaWZpZXI+cHVibGljPC9hY2Nlc3NNb2RpZmllcj4KICAgICAgICAgICAgICAgICAgIDxicmVha0J1aWxkT25Nb2RpZmljYXRpb25zPmZhbHNlPC9icmVha0J1aWxkT25Nb2RpZmljYXRpb25zPgogICAgICAgICAgICAgICAgICAgPGJyZWFrQnVpbGRPbkJpbmFyeUluY29tcGF0aWJsZU1vZGlmaWNhdGlvbnM+ZmFsc2U8L2JyZWFrQnVpbGRPbkJpbmFyeUluY29tcGF0aWJsZU1vZGlmaWNhdGlvbnM+CkBAIC0yMjMsNSArMjI2LDQgQEAKICAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KICAgPC9yZXBvcnRpbmc+Ci0gIC0tPgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9UZXh0cy5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9UZXh0cy5wcm9wZXJ0aWVzCmluZGV4IDZmY2UwODMuLmEzYjRlOTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVGV4dHMucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1RleHRzLnByb3BlcnRpZXMKQEAgLTIsOSArMiwxMSBAQAogZXJyTGFzdEVycm9yPVN5c3RlbSBtZXNzYWdlIGZvciBlcnJvciB7MH0gY291bGQgbm90IGJlIHJldHJpZXZlZCwgZ290IHsxfQogZXJyUmVsZWFzZVNoYXJlZE1lbW9yeT1DYW5ub3QgcmVsZWFzZSBzaGFyZWQgbWVtb3J5OiB7MH0gLSB7MX0KIGVyclVua25vd249dW5rbm93biBlcnJvcgorZXJyVW5rbm93bklkZW50aXR5QWdlbnQ9SWRlbnRpdHlBZ2VudCAnJ3swfScnIHVua25vd24KIGxvZ0Vycm9yTG9hZExpYnJhcnk9Q2Fubm90IGxvYWQgc29ja2V0IGxpYnJhcnk7IFNTSCBhZ2VudCBzdXBwb3J0IGlzIHN3aXRjaGVkIG9mZgogbXNnQ2xvc2VGYWlsZWQ9Q2Fubm90IGNsb3NlIFNTSCBhZ2VudCBzb2NrZXQgezB9CiBtc2dDb25uZWN0RmFpbGVkPUNvdWxkIG5vdCBjb25uZWN0IHRvIFNTSCBhZ2VudCB2aWEgc29ja2V0ICcnezB9JycKK21zZ0Nvbm5lY3RQaXBlRmFpbGVkPUNvdWxkIG5vdCBjb25uZWN0IHRvIFNTSCBhZ2VudCB2aWEgcGlwZSAnJ3swfScnCiBtc2dOb01hcHBlZEZpbGU9Q291bGQgbm90IGNyZWF0ZSBmaWxlIG1hcHBpbmc6IHswfSAtIHsxfQogbXNnTm9TaGFyZWRNZW1vcnk9Q291bGQgbm90IGluaXRpYWxpemUgc2hhcmVkIG1lbW9yeTogezB9IC0gezF9CiBtc2dQYWdlYW50VW5hdmFpbGFibGU9Q291bGQgbm90IGNvbm5lY3QgdG8gUGFnZWFudApAQCAtMTUsMyArMTcsNCBAQAogbXNnU2hvcnRSZWFkPVNob3J0IHJlYWQgZnJvbSBTU0ggYWdlbnQsIGV4cGVjdGVkIHswfaBieXRlcywgZ290IHsxfSBieXRlczsgbGFzdCByZWFkKCkgcmV0dXJuZWQgezJ9CiBwYWdlYW50PVBhZ2VhbnQKIHVuaXhEZWZhdWx0QWdlbnQ9c3NoLWFnZW50Cit3aW5PcGVuU3NoPVdpbjMyIE9wZW5TU0gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9GYWN0b3J5LmphdmEKaW5kZXggZDc0MDliMC4uMWNlZTFiZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9GYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9GYWN0b3J5LmphdmEKQEAgLTExLDExICsxMSwxNSBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50LkNvbm5lY3RvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50LkNvbm5lY3RvckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TeXN0ZW1SZWFkZXI7CiAKIC8qKgpAQCAtMjksNyArMzMsMjAgQEAgcHVibGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBDb25uZWN0b3JGYWN0b3J5IHsKIAlwdWJsaWMgQ29ubmVjdG9yIGNyZWF0ZShTdHJpbmcgaWRlbnRpdHlBZ2VudCwgRmlsZSBob21lRGlyKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmlzV2luZG93cygpKSB7Ci0JCQlyZXR1cm4gbmV3IFBhZ2VhbnRDb25uZWN0b3IoKTsKKwkJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKGlkZW50aXR5QWdlbnQpKSB7CisJCQkJLy8gRGVmYXVsdC4KKwkJCQlyZXR1cm4gbmV3IFBhZ2VhbnRDb25uZWN0b3IoKTsKKwkJCX0KKwkJCVN0cmluZyB3aW5QYXRoID0gaWRlbnRpdHlBZ2VudC5yZXBsYWNlKCcvJywgJ1xcJyk7CisJCQlpZiAoUGFnZWFudENvbm5lY3Rvci5ERVNDUklQVE9SLmdldElkZW50aXR5QWdlbnQoKQorCQkJCQkuZXF1YWxzSWdub3JlQ2FzZSh3aW5QYXRoKSkgeworCQkJCXJldHVybiBuZXcgUGFnZWFudENvbm5lY3RvcigpOworCQkJfQorCQkJaWYgKHdpblBhdGgudG9Mb3dlckNhc2UoTG9jYWxlLlJPT1QpLnN0YXJ0c1dpdGgoIlxcXFwuXFxwaXBlXFwiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIG5ldyBXaW5QaXBlQ29ubmVjdG9yKHdpblBhdGgpOworCQkJfQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlUZXh0cy5nZXQoKS5lcnJVbmtub3duSWRlbnRpdHlBZ2VudCwgaWRlbnRpdHlBZ2VudCkpOwogCQl9CiAJCXJldHVybiBuZXcgVW5peERvbWFpblNvY2tldENvbm5lY3RvcihpZGVudGl0eUFnZW50KTsKIAl9CkBAIC01NSw3ICs3MiwxMSBAQCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAJICovCiAJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb248Q29ubmVjdG9yRGVzY3JpcHRvcj4gZ2V0U3VwcG9ydGVkQ29ubmVjdG9ycygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihnZXREZWZhdWx0Q29ubmVjdG9yKCkpOworCQlpZiAoU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuaXNXaW5kb3dzKCkpIHsKKwkJCXJldHVybiBMaXN0Lm9mKFBhZ2VhbnRDb25uZWN0b3IuREVTQ1JJUFRPUiwKKwkJCQkJV2luUGlwZUNvbm5lY3Rvci5ERVNDUklQVE9SKTsKKwkJfQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVuaXhEb21haW5Tb2NrZXRDb25uZWN0b3IuREVTQ1JJUFRPUik7CiAJfQogCiAJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL0xpYnJhcnlIb2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvTGlicmFyeUhvbGRlci5qYXZhCmluZGV4IGIwOWI1NWYuLjBhNTkyZDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvTGlicmFyeUhvbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvTGlicmFyeUhvbGRlci5qYXZhCkBAIC01Myw2ICs1MywxMCBAQCBwcml2YXRlIExpYnJhcnlIb2xkZXIoKSB7CiAJCWtlcm5lbCA9IEtlcm5lbDMyLklOU1RBTkNFOwogCX0KIAorCVN0cmluZyBzeXN0ZW1FcnJvcigpIHsKKwkJcmV0dXJuIHN5c3RlbUVycm9yKCJbezB9XSAtIHsxfSIpOyAvLyROT04tTkxTLTEkCisJfQorCiAJU3RyaW5nIHN5c3RlbUVycm9yKFN0cmluZyBwYXR0ZXJuKSB7CiAJCWludCBsYXN0RXJyb3IgPSBrZXJuZWwuR2V0TGFzdEVycm9yKCk7CiAJCVN0cmluZyBtc2c7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1BhZ2VhbnRDb25uZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvUGFnZWFudENvbm5lY3Rvci5qYXZhCmluZGV4IGIwZTNiY2UuLjE5Njg0ZWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvUGFnZWFudENvbm5lY3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvUGFnZWFudENvbm5lY3Rvci5qYXZhCkBAIC0yNiw3ICsyNiwxMCBAQCBwdWJsaWMgY2xhc3MgUGFnZWFudENvbm5lY3RvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdG9yIHsKIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIFN0cmluZyBnZXRJZGVudGl0eUFnZW50KCkgewotCQkJcmV0dXJuICJwYWdlYW50IjsgLy8kTk9OLU5MUy0xJAorCQkJLy8gVGhpcyBtdXN0IGJlIGFuIGFic29sdXRlIFdpbmRvd3MgcGF0aCBuYW1lIHRvIGF2b2lkIHRoYXQKKwkJCS8vIE9wZW5Tc2hDb25maWdGaWxlIHRyZWF0cyBpdCBhcyBhIHJlbGF0aXZlIHBhdGggbmFtZS4gVXNlIGFuIFVOQworCQkJLy8gbmFtZSBvbiBsb2NhbGhvc3QsIGxpa2UgZm9yIHBpcGVzLgorCQkJcmV0dXJuICJcXFxcLlxccGFnZWFudCI7IC8vJE5PTi1OTFMtMSQKIAkJfQogCiAJCUBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9Tb2NrZXRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1NvY2tldHMuamF2YQppbmRleCAzZDk1YmRiLi41MmNmNWYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1NvY2tldHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1NvY2tldHMuamF2YQpAQCAtMjQsMTEgKzI0LDYgQEAgcHJpdmF0ZSBTb2NrZXRzKCkgewogCX0KIAogCS8qKgotCSAqIERlZmF1bHQgU1NIIGFnZW50IHNvY2tldCBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVl9TU0hfQVVUSF9TT0NLID0gIlNTSF9BVVRIX1NPQ0siOyAvLyROT04tTkxTLTEkCi0KLQkvKioKIAkgKiBEb21haW4gZm9yIFVuaXggZG9tYWluIHNvY2tldHMuCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUZfVU5JWCA9IDE7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1RleHRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1RleHRzLmphdmEKaW5kZXggZmI0NWIzMC4uZjM4N2M3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9UZXh0cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVGV4dHMuamF2YQpAQCAtMzEsOSArMzEsMTEgQEAgcHVibGljIHN0YXRpYyBUZXh0cyBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBlcnJMYXN0RXJyb3I7CiAJLyoqKi8gcHVibGljIFN0cmluZyBlcnJSZWxlYXNlU2hhcmVkTWVtb3J5OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZXJyVW5rbm93bjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGVyclVua25vd25JZGVudGl0eUFnZW50OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbG9nRXJyb3JMb2FkTGlicmFyeTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIG1zZ0Nsb3NlRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbXNnQ29ubmVjdEZhaWxlZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIG1zZ0Nvbm5lY3RQaXBlRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbXNnTm9NYXBwZWRGaWxlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgbXNnTm9TaGFyZWRNZW1vcnk7CiAJLyoqKi8gcHVibGljIFN0cmluZyBtc2dQYWdlYW50VW5hdmFpbGFibGU7CkBAIC00NCw1ICs0Niw2IEBAIHB1YmxpYyBzdGF0aWMgVGV4dHMgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgbXNnU2hvcnRSZWFkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcGFnZWFudDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuaXhEZWZhdWx0QWdlbnQ7CisJLyoqKi8gcHVibGljIFN0cmluZyB3aW5PcGVuU3NoOwogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1VuaXhEb21haW5Tb2NrZXRDb25uZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVW5peERvbWFpblNvY2tldENvbm5lY3Rvci5qYXZhCmluZGV4IDNiNzVmM2EuLjk1YWMzNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVW5peERvbWFpblNvY2tldENvbm5lY3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9jb25uZWN0b3IvVW5peERvbWFpblNvY2tldENvbm5lY3Rvci5qYXZhCkBAIC0xMSwxMCArMTEsMTAgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50LmNvbm5lY3Rvci5Tb2NrZXRzLkFGX1VOSVg7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYWdlbnQuY29ubmVjdG9yLlNvY2tldHMuREVGQVVMVF9QUk9UT0NPTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3IuU29ja2V0cy5FTlZfU1NIX0FVVEhfU09DSzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3IuU29ja2V0cy5TT0NLX1NUUkVBTTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3IuVW5peFNvY2tldHMuRkRfQ0xPRVhFQzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudC5jb25uZWN0b3IuVW5peFNvY2tldHMuRl9TRVRGRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU3NoQ29uc3RhbnRzLkVOVl9TU0hfQVVUSF9TT0NLRVQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKQEAgLTQ2LDcgKzQ2LDcgQEAgcHVibGljIGNsYXNzIFVuaXhEb21haW5Tb2NrZXRDb25uZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3RvciB7CiAKIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpdHlBZ2VudCgpIHsKLQkJCXJldHVybiBFTlZfU1NIX0FVVEhfU09DSzsKKwkJCXJldHVybiBFTlZfU1NIX0FVVEhfU09DS0VUOwogCQl9CiAKIAkJQE92ZXJyaWRlCkBAIC05MSw4ICs5MSw5IEBAIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBVbml4U29ja2V0cyBnZXRMaWJyYXJ5KCkgewogCXB1YmxpYyBVbml4RG9tYWluU29ja2V0Q29ubmVjdG9yKFN0cmluZyBzb2NrZXRGaWxlKSB7CiAJCXN1cGVyKCk7CiAJCVN0cmluZyBmaWxlID0gc29ja2V0RmlsZTsKLQkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoZmlsZSkpIHsKLQkJCWZpbGUgPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRlbnYoRU5WX1NTSF9BVVRIX1NPQ0spOworCQlpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChmaWxlKQorCQkJCXx8IEVOVl9TU0hfQVVUSF9TT0NLRVQuZXF1YWxzKGZpbGUpKSB7CisJCQlmaWxlID0gU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0ZW52KEVOVl9TU0hfQVVUSF9TT0NLRVQpOwogCQl9CiAJCXRoaXMuc29ja2V0RmlsZSA9IGZpbGU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9XaW5QaXBlQ29ubmVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvY29ubmVjdG9yL1dpblBpcGVDb25uZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmFkOTBmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L2Nvbm5lY3Rvci9XaW5QaXBlQ29ubmVjdG9yLmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmFnZW50LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uU3NoRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQuYWdlbnQuQWJzdHJhY3RDb25uZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudC5Db25uZWN0b3JGYWN0b3J5LkNvbm5lY3RvckRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOworCitpbXBvcnQgY29tLnN1bi5qbmEuTGFzdEVycm9yRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4uam5hLnBsYXRmb3JtLndpbjMyLldpbkJhc2U7CitpbXBvcnQgY29tLnN1bi5qbmEucGxhdGZvcm0ud2luMzIuV2luRXJyb3I7CitpbXBvcnQgY29tLnN1bi5qbmEucGxhdGZvcm0ud2luMzIuV2luTlQ7CitpbXBvcnQgY29tLnN1bi5qbmEucGxhdGZvcm0ud2luMzIuV2luTlQuSEFORExFOworaW1wb3J0IGNvbS5zdW4uam5hLnB0ci5JbnRCeVJlZmVyZW5jZTsKKworLyoqCisgKiBBIGNvbm5lY3RvciBiYXNlZCBvbiBKTkEgdXNpbmcgV2luZG93cycgbmFtZWQgcGlwZXMgdG8gY29tbXVuaWNhdGUgd2l0aCBhbgorICogc3NoIGFnZW50LiBUaGlzIGlzIHVzZWQgYnkgTWljcm9zb2Z0J3MgV2luMzItT3BlblNTSCBwb3J0LgorICovCitwdWJsaWMgY2xhc3MgV2luUGlwZUNvbm5lY3RvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdG9yIHsKKworCS8vIFBpcGUgbmFtZXMgYXJlLCBsaWtlIG90aGVyIGZpbGUgbmFtZXMsIGNhc2UtaW5zZW5zaXRpdmUgb24gV2luZG93cy4KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOT05JQ0FMX1BJUEVfTkFNRSA9ICJcXFxcLlxccGlwZVxcb3BlbnNzaC1zc2gtYWdlbnQiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiB7QGxpbmsgQ29ubmVjdG9yRGVzY3JpcHRvcn0gZm9yIHRoZSB7QGxpbmsgUGFnZWFudENvbm5lY3Rvcn0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDb25uZWN0b3JEZXNjcmlwdG9yIERFU0NSSVBUT1IgPSBuZXcgQ29ubmVjdG9yRGVzY3JpcHRvcigpIHsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXRJZGVudGl0eUFnZW50KCkgeworCQkJcmV0dXJuIENBTk9OSUNBTF9QSVBFX05BTUU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKKwkJCXJldHVybiBUZXh0cy5nZXQoKS53aW5PcGVuU3NoOworCQl9CisJfTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUxFX1NIQVJFX05PTkUgPSAwOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfQVRUUklCVVRFX05PTkUgPSAwOworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGlwZU5hbWU7CisKKwlwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gY29ubmVjdGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oKTsKKworCS8vIEl0J3MgYSBieXRlIHBpcGUsIHNvIHRoZSBub3JtYWwgV2luZG93cyBmaWxlIG1lY2hhbmlzbXMgY2FuIGJlIHVzZWQuCisJLy8gV291bGQgb25lIG9mIHRoZSBzdGFuZGFyZCBKYXZhIEZpbGUgSS9PIGFic3RyYWN0aW9ucyB3b3JrPworCXByaXZhdGUgdm9sYXRpbGUgSEFORExFIGZpbGVIYW5kbGU7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEge0BsaW5rIFdpblBpcGVDb25uZWN0b3J9IGZvciB0aGUgZ2l2ZW4gbmFtZWQgcGlwZS4KKwkgKgorCSAqIEBwYXJhbSBwaXBlTmFtZQorCSAqICAgICAgICAgICAgdG8gY29ubmVjdCB0bworCSAqLworCXB1YmxpYyBXaW5QaXBlQ29ubmVjdG9yKFN0cmluZyBwaXBlTmFtZSkgeworCQl0aGlzLnBpcGVOYW1lID0gcGlwZU5hbWUucmVwbGFjZSgnLycsICdcXCcpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChwaXBlTmFtZSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlIQU5ETEUgZmlsZSA9IGZpbGVIYW5kbGU7CisJCXN5bmNocm9uaXplZCAodGhpcykgeworCQkJaWYgKGNvbm5lY3RlZC5nZXQoKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJTGlicmFyeUhvbGRlciBsaWJzID0gTGlicmFyeUhvbGRlci5nZXRMaWJyYXJ5KCk7CisJCQlpZiAobGlicyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJZmlsZSA9IGxpYnMua2VybmVsLkNyZWF0ZUZpbGUocGlwZU5hbWUsCisJCQkJCVdpbk5ULkdFTkVSSUNfUkVBRCB8IFdpbk5ULkdFTkVSSUNfV1JJVEUsIEZJTEVfU0hBUkVfTk9ORSwKKwkJCQkJbnVsbCwgV2luTlQuT1BFTl9FWElTVElORywgRklMRV9BVFRSSUJVVEVfTk9ORSwgbnVsbCk7CisJCQlpZiAoZmlsZSA9PSBudWxsIHx8IGZpbGUgPT0gV2luQmFzZS5JTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQkJCWludCBlcnJvckNvZGUgPSBsaWJzLmtlcm5lbC5HZXRMYXN0RXJyb3IoKTsKKwkJCQlpZiAoZXJyb3JDb2RlID09IFdpbkVycm9yLkVSUk9SX0ZJTEVfTk9UX0ZPVU5ECisJCQkJCQkmJiBDQU5PTklDQUxfUElQRV9OQU1FLmVxdWFsc0lnbm9yZUNhc2UocGlwZU5hbWUpKSB7CisJCQkJCS8vIE9wZW5TU0ggYWdlbnQgbm90IHJ1bm5pbmcuIERvbid0IHRocm93LgorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCUxhc3RFcnJvckV4Y2VwdGlvbiBjYXVzZSA9IG5ldyBMYXN0RXJyb3JFeGNlcHRpb24oCisJCQkJCQlsaWJzLnN5c3RlbUVycm9yKCkpOworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCQkuZm9ybWF0KFRleHRzLmdldCgpLm1zZ0Nvbm5lY3RQaXBlRmFpbGVkLCBwaXBlTmFtZSksCisJCQkJCQljYXVzZSk7CisJCQl9CisJCQljb25uZWN0ZWQuc2V0KHRydWUpOworCQl9CisJCWZpbGVIYW5kbGUgPSBmaWxlOworCQlyZXR1cm4gY29ubmVjdGVkLmdldCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUhBTkRMRSBmaWxlID0gZmlsZUhhbmRsZTsKKwkJaWYgKGNvbm5lY3RlZC5nZXRBbmRTZXQoZmFsc2UpICYmIGZpbGVIYW5kbGUgIT0gbnVsbCkgeworCQkJZmlsZUhhbmRsZSA9IG51bGw7CisJCQlMaWJyYXJ5SG9sZGVyIGxpYnMgPSBMaWJyYXJ5SG9sZGVyLmdldExpYnJhcnkoKTsKKwkJCWJvb2xlYW4gc3VjY2VzcyA9IGxpYnMua2VybmVsLkNsb3NlSGFuZGxlKGZpbGUpOworCQkJaWYgKCFzdWNjZXNzKSB7CisJCQkJTGFzdEVycm9yRXhjZXB0aW9uIGNhdXNlID0gbmV3IExhc3RFcnJvckV4Y2VwdGlvbigKKwkJCQkJCWxpYnMuc3lzdGVtRXJyb3IoKSk7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCS5mb3JtYXQoVGV4dHMuZ2V0KCkubXNnQ2xvc2VGYWlsZWQsIHBpcGVOYW1lKSwgY2F1c2UpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJ5dGVbXSBycGMoYnl0ZSBjb21tYW5kLCBieXRlW10gbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcHJlcGFyZU1lc3NhZ2UoY29tbWFuZCwgbWVzc2FnZSk7CisJCUhBTkRMRSBmaWxlID0gZmlsZUhhbmRsZTsKKwkJaWYgKCFjb25uZWN0ZWQuZ2V0KCkgfHwgZmlsZSA9PSBudWxsKSB7CisJCQkvLyBObyB0cmFuc2xhdGlvbiwgaW50ZXJuYWwgZXJyb3IKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBjb25uZWN0ZWQgdG8gU1NIIGFnZW50Iik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlMaWJyYXJ5SG9sZGVyIGxpYnMgPSBMaWJyYXJ5SG9sZGVyLmdldExpYnJhcnkoKTsKKwkJd3JpdGVGdWxseShsaWJzLCBmaWxlLCBtZXNzYWdlKTsKKwkJLy8gTm93IHJlY2VpdmUgdGhlIHJlcGx5CisJCWJ5dGVbXSBsZW5ndGhCdWYgPSBuZXcgYnl0ZVs0XTsKKwkJcmVhZEZ1bGx5KGxpYnMsIGZpbGUsIGxlbmd0aEJ1Zik7CisJCWludCBsZW5ndGggPSB0b0xlbmd0aChjb21tYW5kLCBsZW5ndGhCdWYpOworCQlieXRlW10gcGF5bG9hZCA9IG5ldyBieXRlW2xlbmd0aF07CisJCXJlYWRGdWxseShsaWJzLCBmaWxlLCBwYXlsb2FkKTsKKwkJcmV0dXJuIHBheWxvYWQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlRnVsbHkoTGlicmFyeUhvbGRlciBsaWJzLCBIQU5ETEUgZmlsZSwgYnl0ZVtdIG1lc3NhZ2UpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlieXRlW10gYnVmID0gbWVzc2FnZTsKKwkJaW50IHRvV3JpdGUgPSBidWYubGVuZ3RoOworCQl0cnkgeworCQkJd2hpbGUgKHRvV3JpdGUgPiAwKSB7CisJCQkJSW50QnlSZWZlcmVuY2Ugd3JpdHRlbiA9IG5ldyBJbnRCeVJlZmVyZW5jZSgpOworCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGxpYnMua2VybmVsLldyaXRlRmlsZShmaWxlLCBidWYsIGJ1Zi5sZW5ndGgsCisJCQkJCQl3cml0dGVuLCBudWxsKTsKKwkJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQkJdGhyb3cgbmV3IExhc3RFcnJvckV4Y2VwdGlvbihsaWJzLnN5c3RlbUVycm9yKCkpOworCQkJCX0KKwkJCQlpbnQgYWN0dWFsbHlXcml0dGVuID0gd3JpdHRlbi5nZXRWYWx1ZSgpOworCQkJCXRvV3JpdGUgLT0gYWN0dWFsbHlXcml0dGVuOworCQkJCWlmIChhY3R1YWxseVdyaXR0ZW4gPiAwICYmIHRvV3JpdGUgPiAwKSB7CisJCQkJCWJ1ZiA9IEFycmF5cy5jb3B5T2ZSYW5nZShidWYsIGFjdHVhbGx5V3JpdHRlbiwgYnVmLmxlbmd0aCk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChMYXN0RXJyb3JFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlUZXh0cy5nZXQoKS5tc2dTZW5kRmFpbGVkLCBJbnRlZ2VyLnRvU3RyaW5nKG1lc3NhZ2UubGVuZ3RoKSwKKwkJCQkJSW50ZWdlci50b1N0cmluZyh0b1dyaXRlKSksIGUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlYWRGdWxseShMaWJyYXJ5SG9sZGVyIGxpYnMsIEhBTkRMRSBmaWxlLCBieXRlW10gZGF0YSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWludCBuID0gMDsKKwkJaW50IG9mZnNldCA9IDA7CisJCXdoaWxlIChvZmZzZXQgPCBkYXRhLmxlbmd0aCAmJiAobiA9IHJlYWQobGlicywgZmlsZSwgZGF0YSwgb2Zmc2V0LAorCQkJCWRhdGEubGVuZ3RoIC0gb2Zmc2V0KSkgPiAwKSB7CisJCQlvZmZzZXQgKz0gbjsKKwkJfQorCQlpZiAob2Zmc2V0IDwgZGF0YS5sZW5ndGgpIHsKKwkJCXRocm93IG5ldyBTc2hFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCVRleHRzLmdldCgpLm1zZ1Nob3J0UmVhZCwgSW50ZWdlci50b1N0cmluZyhkYXRhLmxlbmd0aCksCisJCQkJCUludGVnZXIudG9TdHJpbmcob2Zmc2V0KSwgSW50ZWdlci50b1N0cmluZyhuKSkpOworCQl9CisJfQorCisJcHJpdmF0ZSBpbnQgcmVhZChMaWJyYXJ5SG9sZGVyIGxpYnMsIEhBTkRMRSBmaWxlLCBieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LAorCQkJaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWludCB0b1JlYWQgPSBsZW5ndGg7CisJCQlJbnRCeVJlZmVyZW5jZSByZWFkID0gbmV3IEludEJ5UmVmZXJlbmNlKCk7CisJCQlpZiAob2Zmc2V0ID09IDApIHsKKwkJCQlib29sZWFuIHN1Y2Nlc3MgPSBsaWJzLmtlcm5lbC5SZWFkRmlsZShmaWxlLCBidWZmZXIsIHRvUmVhZCwKKwkJCQkJCXJlYWQsIG51bGwpOworCQkJCWlmICghc3VjY2VzcykgeworCQkJCQl0aHJvdyBuZXcgTGFzdEVycm9yRXhjZXB0aW9uKGxpYnMuc3lzdGVtRXJyb3IoKSk7CisJCQkJfQorCQkJCXJldHVybiByZWFkLmdldFZhbHVlKCk7CisJCQl9CisJCQlieXRlW10gZGF0YSA9IG5ldyBieXRlW2xlbmd0aF07CisJCQlib29sZWFuIHN1Y2Nlc3MgPSBsaWJzLmtlcm5lbC5SZWFkRmlsZShmaWxlLCBidWZmZXIsIHRvUmVhZCwgcmVhZCwKKwkJCQkJbnVsbCk7CisJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQl0aHJvdyBuZXcgTGFzdEVycm9yRXhjZXB0aW9uKGxpYnMuc3lzdGVtRXJyb3IoKSk7CisJCQl9CisJCQlpbnQgYWN0dWFsbHlSZWFkID0gcmVhZC5nZXRWYWx1ZSgpOworCQkJaWYgKGFjdHVhbGx5UmVhZCA+IDApIHsKKwkJCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIGJ1ZmZlciwgb2Zmc2V0LCBhY3R1YWxseVJlYWQpOworCQkJfQorCQkJcmV0dXJuIGFjdHVhbGx5UmVhZDsKKwkJfSBjYXRjaCAoTGFzdEVycm9yRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJVGV4dHMuZ2V0KCkubXNnUmVhZEZhaWxlZCwgSW50ZWdlci50b1N0cmluZyhsZW5ndGgpKSwgZSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGUyYTJlZmMuLjQxMWQ0M2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDM1ICszLDM0IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQotSW1wb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY29uZmlnLmhvc3RzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5hdXRoO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5oZWxwZXJzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V5cHJvdmlkZXI7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zZXNzaW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2lnbmF0dXJlO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5uZXQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLnNlY3VyaXR5O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb3JlO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXI7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5mb3J3YXJkO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjAsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLnByb3h5O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2g7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5ob3N0czt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uYXV0aDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaGVscGVyczt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleXByb3ZpZGVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwubmV0O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29yZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuZm9yd2FyZDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5wcm94eTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCiAgb3JnLmhhbWNyZXN0O3ZlcnNpb249IlsxLjEuMCwzLjAuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLAogIG9yZy5qdW5pdC5leHBlcmltZW50YWwudGhlb3JpZXM7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC9wb20ueG1sCmluZGV4IGE4OGRkYWYuLjNlOThlMzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvQXBhY2hlU3NoVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvQXBhY2hlU3NoVGVzdC5qYXZhCmluZGV4IGNjYWY5OGMuLjNkN2M3NjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9zc2hkL0FwYWNoZVNzaFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvc3NoZC9BcGFjaGVTc2hUZXN0LmphdmEKQEAgLTEwNyw2ICsxMDcsMzIgQEAgcHVibGljIHZvaWQgdGVzdEVkMjU1MTlIb3N0S2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJIklkZW50aXR5RmlsZSAiICsgcHJpdmF0ZUtleTEuZ2V0QWJzb2x1dGVQYXRoKCkpOwogCX0KIAorCS8qKgorCSAqIFRlc3QgZm9yIFNTSEQtMTIzMS4gSWYgYXV0aGVudGljYXRpb24gaXMgYXR0ZW1wdGVkIGZpcnN0IHdpdGggYW4gUlNBIGtleSwKKwkgKiB3aGljaCBpcyByZWplY3RlZCwgYW5kIHRoZW4gd2l0aCBzb21lIG90aGVyIGtleSB0eXBlIChoZXJlIGVkMjU1MTkpLAorCSAqIGF1dGhlbnRpY2F0aW9uIGZhaWxzIGluIGJ1ZyBTU0hELTEyMzEuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIG9uIGVycm9ycworCSAqIEBzZWUgPGEgaHJlZj0KKwkgKiAgICAgICJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1NTSEQtMTIzMSI+U1NIRC0xMjMxPC9hPgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFdyb25nS2V5Rmlyc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmlsZSB1c2VyS2V5ID0gbmV3IEZpbGUoZ2V0VGVtcG9yYXJ5RGlyZWN0b3J5KCksICJ1c2Vya2V5Iik7CisJCWNvcHlUZXN0UmVzb3VyY2UoImlkX2VkMjU1MTkiLCB1c2VyS2V5KTsKKwkJRmlsZSBwdWJsaWNLZXkgPSBuZXcgRmlsZShnZXRUZW1wb3JhcnlEaXJlY3RvcnkoKSwgInVzZXJrZXkucHViIik7CisJCWNvcHlUZXN0UmVzb3VyY2UoImlkX2VkMjU1MTkucHViIiwgcHVibGljS2V5KTsKKwkJc2VydmVyLnNldFRlc3RVc2VyUHVibGljS2V5KHB1YmxpY0tleS50b1BhdGgoKSk7CisJCWNsb25lV2l0aCgic3NoOi8vZ2l0L2RvZXNudG1hdHRlciIsIGRlZmF1bHRDbG9uZURpciwgbnVsbCwgLy8KKwkJCQkiSG9zdCBnaXQiLCAvLworCQkJCSJIb3N0TmFtZSBsb2NhbGhvc3QiLCAvLworCQkJCSJQb3J0ICIgKyB0ZXN0UG9ydCwgLy8KKwkJCQkiVXNlciAiICsgVEVTVF9VU0VSLCAvLworCQkJCSJJZGVudGl0eUZpbGUgIiArIHByaXZhdGVLZXkxLmdldEFic29sdXRlUGF0aCgpLCAvLyBSU0EKKwkJCQkiSWRlbnRpdHlGaWxlICIgKyB1c2VyS2V5LmdldEFic29sdXRlUGF0aCgpKTsKKwl9CisKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RIYXNoZWRLbm93bkhvc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydFRydWUoIkZhaWxlZCB0byBkZWxldGUga25vd25faG9zdHMiLCBrbm93bkhvc3RzLmRlbGV0ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA4MWUwMWNjLi43M2ZlYWVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC02LDkgKzYsOSBAQAogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkO3ZlcnNpb249IjYuMC4xIjt4LWludGVybmFsOj10cnVlOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQ7dmVyc2lvbj0iNi4xLjEiO3gtaW50ZXJuYWw6PXRydWU7CiAgIHVzZXM6PSJvcmcuYXBhY2hlLnNzaGQuY2xpZW50LAogICAgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLAogICAgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLmtleWJvYXJkLApAQCAtMjMsNzIgKzIzLDc1IEBACiAgICBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZSwKICAgIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hZ2VudDt2ZXJzaW9uPSI2LjAuMSI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLmF1dGg7dmVyc2lvbj0iNi4wLjEiO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5wcm94eTt2ZXJzaW9uPSI2LjAuMSI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaGQ7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuYWdlbnQ7dmVyc2lvbj0iNi4xLjEiO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5hdXRoO3ZlcnNpb249IjYuMS4xIjt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQucHJveHk7dmVyc2lvbj0iNi4xLjEiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jb25maWcuaG9zdHMsCiAgICBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleXByb3ZpZGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLAogICAgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5zZXNzaW9uLAogICAgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5rZXl2ZXJpZmllciIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudDt2ZXJzaW9uPSI2LjAuMSIKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50O3ZlcnNpb249IjYuMS4xIgogSW1wb3J0LVBhY2thZ2U6IG5ldC5pMnAuY3J5cHRvLmVkZHNhO3ZlcnNpb249IlswLjMuMCwwLjQuMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5hZ2VudDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgua2V5Ym9hcmQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLnBhc3N3b3JkO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wdWJrZXk7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jaGFubmVsO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY29uZmlnLmhvc3RzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY29uZmlnLmtleXM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5mdXR1cmU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5rZXl2ZXJpZmllcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LnNlc3Npb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5zZXNzaW9uLmZvcndhcmQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmF1dGg7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jaGFubmVsO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29tcHJlc3Npb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5czt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLmxvYWRlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLmxvYWRlci5vcGVuc3NoLmtkZjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmRpZ2VzdDt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmZvcndhcmQ7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5mdXR1cmU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5oZWxwZXJzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaW87dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXg7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguZXh0ZW5zaW9uO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4LmV4dGVuc2lvbi5wYXJzZXI7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXlwcm92aWRlcjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLm1hYzt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnJhbmRvbTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb247dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zZXNzaW9uLmhlbHBlcnM7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zaWduYXR1cmU7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXI7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmNsb3NlYWJsZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuaW87dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvLmZ1bmN0b3JzO3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5pby5yZXNvdXJjZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwubG9nZ2luZzt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwubmV0O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuY29yZTt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGg7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNmdHA7dmVyc2lvbj0iWzIuNy4wLDIuOC4wKSIsCi0gb3JnLmFwYWNoZS5zc2hkLnNmdHAuY2xpZW50O3ZlcnNpb249IlsyLjcuMCwyLjguMCkiLAotIG9yZy5hcGFjaGUuc3NoZC5zZnRwLmNvbW1vbjt2ZXJzaW9uPSJbMi43LjAsMi44LjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2g7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5hZ2VudDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgua2V5Ym9hcmQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLnBhc3N3b3JkO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wdWJrZXk7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jaGFubmVsO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY29uZmlnLmhvc3RzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuY29uZmlnLmtleXM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5mdXR1cmU7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5rZXl2ZXJpZmllcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LnNlc3Npb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5zZXNzaW9uLmZvcndhcmQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmF1dGg7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jaGFubmVsO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29tcHJlc3Npb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jb25maWcua2V5czt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLmxvYWRlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLmxvYWRlci5vcGVuc3NoLmtkZjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLnUyZjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmRpZ2VzdDt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmZvcndhcmQ7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5mdXR1cmU7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5oZWxwZXJzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24uaW87dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXg7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguZXh0ZW5zaW9uO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4LmV4dGVuc2lvbi5wYXJzZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXlwcm92aWRlcjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLm1hYzt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnJhbmRvbTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb247dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zZXNzaW9uLmhlbHBlcnM7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zaWduYXR1cmU7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmJ1ZmZlci5rZXlzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5jbG9zZWFibGU7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5pby5kZXI7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvLmZ1bmN0b3JzO3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5pby5yZXNvdXJjZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwubG9nZ2luZzt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwubmV0O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuY29yZTt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLmF1dGg7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNmdHA7dmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIsCisgb3JnLmFwYWNoZS5zc2hkLnNmdHAuY2xpZW50O3ZlcnNpb249IlsyLjguMCwyLjkuMCkiLAorIG9yZy5hcGFjaGUuc3NoZC5zZnRwLmNvbW1vbjt2ZXJzaW9uPSJbMi44LjAsMi45LjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2g7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggYjc3MGI5MC4uOWZlZmE2ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZSAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZTt2ZXJzaW9uPSI2LjAuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgorRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZTt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9SRUFETUUubWQKaW5kZXggY2JhODdhYy4uZjA2YjJmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL1JFQURNRS5tZAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvUkVBRE1FLm1kCkBAIC00Myw2ICs0Myw1MyBAQAogICAuY2FsbCgpOwogYGBgCiAKKyMjIFN1cHBvcnQgZm9yIFNTSCBhZ2VudHMKKworVGhlcmUgZXhpc3QgdHdvIElFVEYgZHJhZnQgUkZDcyBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIGFuIFNTSCBhZ2VudDoKKworKiBhbiBvbGRlciBbU1NIMSBwcm90b2NvbF0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtc2Vjc2gtYWdlbnQtMDIpIHRoYXQgY2FuIGRlYWwgb25seSB3aXRoIERTQSBhbmQgUlNBIGtleXMsIGFuZAorKiBhIG5ld2VyIFtTU0gyIHByb3RvY29sXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtbWlsbGVyLXNzaC1hZ2VudC0wNCkgKGZyb20gT3BlblNTSCkuCisKK0pHaXQgb25seSBzdXBwb3J0cyB0aGUgbmV3ZXIgT3BlblNTSCBwcm90b2NvbC4KKworQ29tbXVuaWNhdGlvbiB3aXRoIGFuIFNTSCBhZ2VudCBjYW4gb2NjdXIgb3ZlciBhbnkgdHJhbnNwb3J0IHByb3RvY29sLCBhbmQgZGlmZmVyZW50CitTU0ggYWdlbnRzIG1heSB1c2UgZGlmZmVyZW50IHRyYW5zcG9ydHMgZm9yIGxvY2FsIGNvbW11bmljYXRpb24uIEpHaXQgcHJvdmlkZXMgc29tZQordHJhbnNwb3J0cyB2aWEgdGhlIFtvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUuYWdlbnRdKC4uL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS5hZ2VudC9SRUFETUUubWQpCitmcmFnbWVudCwgd2hpY2ggYXJlIGRpc2NvdmVyZWQgZnJvbSBgb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlYCBhbHNvIHZpYSB0aGUgYFNlcnZpY2VMb2FkZXJgIG1lY2hhbmlzbTsKK3RoZSBTUEkgKHNlcnZpY2UgcHJvdmlkZXIgaW50ZXJmYWNlKSBpcyBgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudC5Db25uZWN0b3JGYWN0b3J5YC4KKworSWYgc3VjaCBhIGBDb25uZWN0b3JGYWN0b3J5YCBpbXBsZW1lbnRhdGlvbiBpcyBmb3VuZCwgSkdpdCBtYXkgdXNlIGFuIFNTSCBhZ2VudC4gSWYgbm9uZQoraXMgYXZhaWxhYmxlLCBKR2l0IGNhbm5vdCBjb21tdW5pY2F0ZSB3aXRoIGFuIFNTSCBhZ2VudCwgYW5kIHdpbGwgbm90IGF0dGVtcHQgdG8gdXNlIG9uZS4KKworIyMjIFNTSCBjb25maWd1cmF0aW9ucyBmb3IgU1NIIGFnZW50cworCitUaGVyZSBhcmUgc2V2ZXJhbCBTU0ggcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBgfi8uc3NoL2NvbmZpZ2AgZmlsZSB0byBjb25maWd1cmUKK3RoZSB1c2Ugb2YgYW4gU1NIIGFnZW50LiBGb3IgdGhlIGRldGFpbHMsIHNlZSB0aGUgW09wZW5CU0Qgc3NoLWNvbmZpZyBkb2N1bWVudGF0aW9uXShodHRwczovL21hbi5vcGVuYnNkLm9yZy9zc2hfY29uZmlnLjUpLgorCisqICoqQWRkS2V5c1RvQWdlbnQqKiBjYW4gYmUgc2V0IHRvIGBub2AsIGB5ZXNgLCBvciBgYXNrYC4gSWYgc2V0IHRvIGB5ZXNgLCBrZXlzIHdpbGwgYmUgYWRkZWQKKyAgdG8gdGhlIGFnZW50IGlmIHRoZXkncmUgbm90IHlldCBpbiB0aGUgYWdlbnQuIElmIHNldCB0byBgYXNrYCwgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZAorICBiZWZvcmUgZG9pbmcgc28sIGFuZCBjYW4gb3B0IG91dCBvZiBhZGRpbmcgdGhlIGtleS4gSkdpdCBhbHNvIHN1cHBvcnRzIHRoZSBhZGRpdGlvbmFsCisgIHNldHRpbmdzIGBjb25maXJtYCBhbmQga2V5IGxpZmV0aW1lcy4KKyogKipJZGVudGl0eUFnZW50KiogY2FuIGJlIHNldCB0byBjaG9vc2Ugd2hpY2ggU1NIIGFnZW50IHRvIHVzZSwgaWYgdGhlcmUgYXJlIHNldmVyYWwgcnVubmluZy4KKyAgSXQgY2FuIGFsc28gYmUgc2V0IHRvIGBub25lYCB0byBleHBsaWNpdGx5IHN3aXRjaCBvZmYgdXNpbmcgYW4gU1NIIGFnZW50IGF0IGFsbC4KKyogKipJZGVudGl0aWVzT25seSoqIGlmIHNldCB0byBgeWVzYCBhbmQgYW4gU1NIIGFnZW50IGlzIHVzZWQsIG9ubHkga2V5cyBmcm9tIHRoZSBhZ2VudCB0aGF0IGFyZQorICBhbHNvIGxpc3RlZCBpbiBhbiBgSWRlbnRpdHlGaWxlYCBwcm9wZXJ0eSB3aWxsIGJlIGNvbnNpZGVyZWQuIChJdCdsbCBhbHNvIHN3aXRjaCBvZmYgdHJ5aW5nCisgIGRlZmF1bHQga2V5IG5hbWVzLCBzdWNoIGFzIGB+Ly5zc2gvaWRfcnNhYCBvciBgfi8uc3NoL2lkX2VkMjU1MTlgOyBvbmx5IGtleXMgbGlzdGVkIGV4cGxpY2l0bHkKKyAgd2lsbCBiZSB1c2VkLikKKworIyMjIExpbWl0YXRpb25zCisKK0FzIG1lbnRpb25lZCBhYm92ZSBKR2l0IG9ubHkgaW1wbGVtZW50cyB0aGUgbmV3ZXIgT3BlblNTSCBwcm90b2NvbC4gT3BlblNTSCBmdWxseSBpbXBsZW1lbnRzIHRoaXMsCitidXQgc29tZSBvdGhlciBTU0ggYWdlbnRzIG9ubHkgb2ZmZXIgcGFydGlhbCBpbXBsZW1lbnRhdGlvbnMuIEluIHBhcnRpY3VsYXIgb24gV2luZG93cywgbmVpdGhlcgorUGFnZWFudCBub3IgV2luMzItT3BlblNTSCBpbXBsZW1lbnQgdGhlIGBjb25maXJtYCBvciBsaWZldGltZSBjb25zdHJhaW50cyBmb3IgYEFkZEtleXNUb0FnZW50YC4gV2l0aAorc3VjaCBTU0ggYWdlbnRzLCB0aGVzZSBzZXR0aW5ncyBzaG91bGQgbm90IGJlIHVzZWQgaW4gYH4vLnNzaC9jb25maWdgLiBHUEcncyBncGctYWdlbnQgY2FuIGJlIHJ1bgord2l0aCBvcHRpb24gYGVuYWJsZV9wdXR0eV9zdXBwb3J0YCBhbmQgY2FuIHRoZW4gYmUgdXNlZCBhcyBhIFBhZ2VhbnQgcmVwbGFjZW1lbnQuIGdwZy1hZ2VudCBhcHBlYXJzCit0byBzdXBwb3J0IHRoZXNlIGtleSBjb25zdHJhaW50cy4KKworT3BlblNTSCBkb2VzIG5vdCBpbXBsZW1lbnQgZWQ0NDgga2V5cywgYW5kIG5laXRoZXIgZG9lcyBBcGFjaGUgTUlOQSBzc2hkLCBhbmQgaGVuY2Ugc3VjaCBrZXlzIGFyZQorbm90IHN1cHBvcnRlZCBpbiBKR2l0IGlmIGl0cyBidWlsdC1pbiBTU0ggaW1wbGVtZW50YXRpb24gaXMgdXNlZC4gZWQ0NDggb3Igb3RoZXIgdW5zdXBwb3J0ZWQga2V5cworcHJvdmlkZWQgYnkgYW4gU1NIIGFnZW50IGFyZSBpZ25vcmVkLgorCiAjIyBVc2luZyBhIGRpZmZlcmVudCBTU0ggaW1wbGVtZW50YXRpb24KIAogVG8gdXNlIGEgZGlmZmVyZW50IFNTSCBpbXBsZW1lbnRhdGlvbjoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3BvbS54bWwKaW5kZXggMzQwY2NhMS4uNjc0YzdhNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3BvbS54bWwKQEAgLTE3LDcgKzE3LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGU8L2FydGlmYWN0SWQ+CkBAIC01MCw2ICs1MCwxNiBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zc2hkPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+c3NoZC1zZnRwPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+JHthcGFjaGUtc3NoZC12ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3NoZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3NoZC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3NoZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3NoZC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CiAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPGRlcGVuZGVuY3k+CkBAIC0xNTQsNiArMTY0LDkgQEAKICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuZWNsaXBzZS5qZ2l0Lio8L2luY2x1ZGU+CiAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPiouaW50ZXJuYWwuKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CiAgICAgICAgICAgICAgICAgICA8YWNjZXNzTW9kaWZpZXI+cHVibGljPC9hY2Nlc3NNb2RpZmllcj4KICAgICAgICAgICAgICAgICAgIDxicmVha0J1aWxkT25Nb2RpZmljYXRpb25zPmZhbHNlPC9icmVha0J1aWxkT25Nb2RpZmljYXRpb25zPgogICAgICAgICAgICAgICAgICAgPGJyZWFrQnVpbGRPbkJpbmFyeUluY29tcGF0aWJsZU1vZGlmaWNhdGlvbnM+ZmFsc2U8L2JyZWFrQnVpbGRPbkJpbmFyeUluY29tcGF0aWJsZU1vZGlmaWNhdGlvbnM+CkBAIC0yMDcsNiArMjIwLDkgQEAKICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuZWNsaXBzZS5qZ2l0Lio8L2luY2x1ZGU+CiAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPiouaW50ZXJuYWwuKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CiAgICAgICAgICAgICAgICAgICA8YWNjZXNzTW9kaWZpZXI+cHVibGljPC9hY2Nlc3NNb2RpZmllcj4KICAgICAgICAgICAgICAgICAgIDxicmVha0J1aWxkT25Nb2RpZmljYXRpb25zPmZhbHNlPC9icmVha0J1aWxkT25Nb2RpZmljYXRpb25zPgogICAgICAgICAgICAgICAgICAgPGJyZWFrQnVpbGRPbkJpbmFyeUluY29tcGF0aWJsZU1vZGlmaWNhdGlvbnM+ZmFsc2U8L2JyZWFrQnVpbGRPbkJpbmFyeUluY29tcGF0aWJsZU1vZGlmaWNhdGlvbnM+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvU3NoZFRleHQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Tc2hkVGV4dC5wcm9wZXJ0aWVzCmluZGV4IDJiYmE3MzYuLjRmNzM1YmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Tc2hkVGV4dC5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Tc2hkVGV4dC5wcm9wZXJ0aWVzCkBAIC0xLDUgKzEsNiBAQAogYXV0aGVudGljYXRpb25DYW5jZWxlZD1TU0ggYXV0aGVudGljYXRpb24gY2FuY2VsZWQ6IG5vIHBhc3N3b3JkIGdpdmVuCiBhdXRoZW50aWNhdGlvbk9uQ2xvc2VkU2Vzc2lvbj1BdXRoZW50aWNhdGlvbiBjYW5jZWxlZDogc2Vzc2lvbiBpcyBhbHJlYWR5IGNsb3Npbmcgb3IgY2xvc2VkCitjYW5ub3RSZWFkUHVibGljS2V5PUNhbm5vdCByZWFkIHB1YmxpYyBrZXkgZnJvbSBmaWxlIHswfQogY2xvc2VMaXN0ZW5lckZhaWxlZD1Tc2ggc2Vzc2lvbiBjbG9zZSBsaXN0ZW5lciBmYWlsZWQKIGNvbmZpZ0ludmFsaWRQYXRoPUludmFsaWQgcGF0aCBpbiBzc2ggY29uZmlnIGtleSB7MH06IHsxfQogY29uZmlnSW52YWxpZFBhdHRlcm49SW52YWxpZCBwYXR0ZXJuIGluIHNzaCBjb25maWcga2V5IHswfTogezF9CkBAIC03Nyw2ICs3OCw4IEBACiBwcm94eVNvY2tzVW5leHBlY3RlZE1lc3NhZ2U9VW5leHBlY3RlZCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gU09DS1M1IHByb3h5IHswfTsgY2xpZW50IHN0YXRlIHsxfTogezJ9CiBwcm94eVNvY2tzVW5leHBlY3RlZFZlcnNpb249RXhwZWN0ZWQgU09DS1MgdmVyc2lvbiA1LCBnb3QgezB9CiBwcm94eVNvY2tzVXNlcm5hbWVUb29Mb25nPVVzZXIgbmFtZSBmb3IgcHJveHkgezB9IG11c3QgYmUgYXQgbW9zdCAyNTUgYnl0ZXMgbG9uZywgaXMgezF9IGJ5dGVzOiB7Mn0KK3B1YmtleUF1dGhBZGRLZXlUb0FnZW50RXJyb3I9Q291bGQgbm90IGFkZCB7MH0ga2V5IHdpdGggZmluZ2VycHJpbnQgezF9IHRvIHRoZSBTU0ggYWdlbnQKK3B1YmtleUF1dGhBZGRLZXlUb0FnZW50UXVlc3Rpb249QWRkIHRoZSB7MH0ga2V5IHdpdGggZmluZ2VycHJpbnQgezF9IHRvIHRoZSBTU0ggYWdlbnQ/CiBwdWJrZXlBdXRoV3JvbmdDb21tYW5kPVB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gcmVjZWl2ZWQgdW5rbm93biBTU0ggY29tbWFuZCB7MH0gZnJvbSB7MX0gKHsyfSkKIHB1YmtleUF1dGhXcm9uZ0tleT1QdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uIHJlY2VpdmVkIHdyb25nIGtleTsgc2VudCB7MH0sIGdvdCBiYWNrIHsxfSBmcm9tIHsyfSAoezN9KQogcHVia2V5QXV0aFdyb25nU2lnbmF0dXJlQWxnb3JpdGhtPVB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24gcmVxdWVzdGVkIHNpZ25hdHVyZSB0eXBlIHswfSBidXQgZ290IGJhY2sgezF9IGZyb20gezJ9ICh7M30pCkBAIC04NSw5ICs4OCwxMyBAQAogc2VydmVySWRXaXRoTnVsPVNlcnZlciBpZGVudGlmaWNhdGlvbiBjb250YWlucyBhIE5VTCBjaGFyYWN0ZXI6IHswfQogc2Vzc2lvbkNsb3NlRmFpbGVkPUNsb3NpbmcgdGhlIHNlc3Npb24gZmFpbGVkCiBzZXNzaW9uV2l0aG91dFVzZXJuYW1lPVNTSCBzZXNzaW9uIGNyZWF0ZWQgd2l0aG91dCB1c2VyIG5hbWU7IGNhbm5vdCBhdXRoZW50aWNhdGUKK3NzaEFnZW50RWREU0FGb3JtYXRFcnJvcj1DYW5ub3QgYWRkIGVkMjU1MTkga2V5IHRvIHRoZSBTU0ggYWdlbnQgYmVjYXVzZSBpdCBpcyBlbmNvZGVkIGFzIHswfSBpbnN0ZWFkIG9mIFBLQ1MjOAorc3NoQWdlbnRQYXlsb2FkTGVuZ3RoRXJyb3I9RXhwZWN0ZWQgezAsY2hvaWNlLDAjbm8gYnl0ZXN8MSNvbmUgYnl0ZXwxPHswfSBieXRlc30gYnV0IGdvdCB7MX0KIHNzaEFnZW50UmVwbHlMZW5ndGhFcnJvcj1JbnZhbGlkIFNTSCBhZ2VudCByZXBseSBtZXNzYWdlIGxlbmd0aCB7MH0gYWZ0ZXIgY29tbWFuZCB7MX0KIHNzaEFnZW50UmVwbHlVbmV4cGVjdGVkPVVuZXhwZWN0ZWQgcmVwbHkgZnJvbSBzc2gtYWdlbnQ6IHswfQogc3NoQWdlbnRTaG9ydFJlYWRCdWZmZXI9U2hvcnQgcmVhZCBmcm9tIFNTSCBhZ2VudAorc3NoQWdlbnRVbmtub3duS2V5PVNTSCBhZ2VudCBkZWxpdmVyZWQgYSBrZXkgdGhhdCBjYW5ub3QgYmUgaGFuZGxlZAorc3NoQWdlbnRXcm9uZ0tleUxlbmd0aD1TU0ggYWdlbnQgZGVsaXZlcmVkIGlsbG9naWNhbCBrZXkgbGVuZ3RoIHswfSBhdCBvZmZzZXQgezF9IGluIGJ1ZmZlciBvZiBsZW5ndGggezJ9CiBzc2hBZ2VudFdyb25nTnVtYmVyT2ZLZXlzPUludmFsaWQgbnVtYmVyIG9mIFNTSCBhZ2VudCBrZXlzOiB7MH0KIHNzaENsb3NpbmdEb3duPUFwYWNoZSBNSU5BIHNzaGQgc2Vzc2lvbiBmYWN0b3J5IGlzIGNsb3NpbmcgZG93bjsgY2Fubm90IGNyZWF0ZSBuZXcgc3NoIHNlc3Npb25zIG9uIHRoaXMgZmFjdG9yeQogc3NoQ29tbWFuZFRpbWVvdXQ9ezB9IHRpbWVkIG91dCBhZnRlciB7MX0gc2Vjb25kcyB3aGlsZSBvcGVuaW5nIHRoZSBjaGFubmVsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdENsaWVudFNlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0Q2xpZW50U2Vzc2lvbi5qYXZhCmluZGV4IGUyZGJiNGMuLjUxMDBiYzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0Q2xpZW50U2Vzc2lvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0Q2xpZW50U2Vzc2lvbi5qYXZhCkBAIC00Miw3ICs0Miw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5pby5Jb1dyaXRlRnV0dXJlOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4LkJ1aWx0aW5ESEZhY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmtleC5ESEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguS2V4UHJvcG9zYWxPcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5rZXguS2V5RXhjaGFuZ2VGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4LmV4dGVuc2lvbi5LZXhFeHRlbnNpb25IYW5kbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V4LmV4dGVuc2lvbi5LZXhFeHRlbnNpb25IYW5kbGVyLkF2YWlsYWJpbGl0eVBoYXNlOwpAQCAtMTk5LDI0ICsxOTgsNiBAQCBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoUmVhZGFibGUgYnVmZmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBNYXA8S2V4UHJvcG9zYWxPcHRpb24sIFN0cmluZz4gc2V0TmVnb3RpYXRpb25SZXN1bHQoCi0JCQlNYXA8S2V4UHJvcG9zYWxPcHRpb24sIFN0cmluZz4gZ3Vlc3MpIHsKLQkJTWFwPEtleFByb3Bvc2FsT3B0aW9uLCBTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLnNldE5lZ290aWF0aW9uUmVzdWx0KAotCQkJCWd1ZXNzKTsKLQkJLy8gVGhpcyBzaG91bGQgYmUgZG9hYmxlIHdpdGggYSBTZXNzaW9uTGlzdGVuZXIsIHRvbywgYnV0IEkgZG9uJ3Qgc2VlCi0JCS8vIGhvdyB0byBhZGQgYSBsaXN0ZW5lciBpbiB0aW1lIHRvIGNhdGNoIHRoZSBuZWdvdGlhdGlvbiBlbmQgZm9yIHN1cmUKLQkJLy8gZ2l2ZW4gdGhhdCB0aGUgc3VwZXItY29uc3RydWN0b3IgYWxyZWFkeSBzdGFydHMgS0VYLgotCQkvLwotCQkvLyBUT0RPOiBUaGlzIG92ZXJyaWRlIGNhbiBiZSByZW1vdmVkIG9uY2Ugd2UgdXNlIHNzaGQgMi44LjAuCi0JCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJcmVzdWx0LmZvckVhY2goKG9wdGlvbiwgdmFsdWUpIC0+IGxvZy5kZWJ1ZygKLQkJCQkJInNldE5lZ290aWF0aW9uUmVzdWx0KHt9KSBLZXg6IHt9ID0ge30iLCB0aGlzLCAvLyROT04tTkxTLTEkCi0JCQkJCW9wdGlvbi5nZXREZXNjcmlwdGlvbigpLCB2YWx1ZSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCiAJU2V0PFN0cmluZz4gZ2V0QWxsQXZhaWxhYmxlU2lnbmF0dXJlQWxnb3JpdGhtcygpIHsKIAkJU2V0PFN0cmluZz4gYWxsQXZhaWxhYmxlID0gbmV3IEhhc2hTZXQ8PigpOwogCQlCdWlsdGluU2lnbmF0dXJlcy5WQUxVRVMuZm9yRWFjaChzIC0+IGFsbEF2YWlsYWJsZS5hZGQocy5nZXROYW1lKCkpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0UHVibGljS2V5QXV0aGVudGljYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9KR2l0UHVibGljS2V5QXV0aGVudGljYXRpb24uamF2YQppbmRleCBjMDgyYTlhLi45NmRhMGNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvSkdpdFB1YmxpY0tleUF1dGhlbnRpY2F0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL0pHaXRQdWJsaWNLZXlBdXRoZW50aWNhdGlvbi5qYXZhCkBAIC0xMiwyNSArMTIsNjggQEAKIGltcG9ydCBzdGF0aWMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0OwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Tc2hDb25zdGFudHMuUFVCS0VZX0FDQ0VQVEVEX0FMR09SSVRITVM7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuSW52YWxpZFBhdGhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5MaW5rT3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmFnZW50LlNzaEFnZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5hZ2VudC5Tc2hBZ2VudEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmFnZW50LlNzaEFnZW50S2V5Q29uc3RyYWludDsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgucHVia2V5LktleUFnZW50SWRlbnRpdHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5hdXRoLnB1YmtleS5QdWJsaWNLZXlJZGVudGl0eTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmF1dGgucHVia2V5LlVzZXJBdXRoUHVibGljS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jbGllbnQuYXV0aC5wdWJrZXkuVXNlckF1dGhQdWJsaWNLZXlJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY2xpZW50LmNvbmZpZy5ob3N0cy5Ib3N0Q29uZmlnRW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5zZXNzaW9uLkNsaWVudFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5GYWN0b3J5TWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLk5hbWVkRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLkF1dGhvcml6ZWRLZXlFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLktleVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uY29uZmlnLmtleXMuUHVibGljS2V5RW50cnlSZXNvbHZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLnUyZi5TZWN1cml0eUtleVB1YmxpY0tleTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNpZ25hdHVyZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5zaWduYXR1cmUuU2lnbmF0dXJlRmFjdG9yaWVzTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2guT3BlblNzaENvbmZpZ0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuQ3JlZGVudGlhbEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuQ3JlZGVudGlhbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Tc2hDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVVJJaXNoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TdHJpbmdVdGlsczsKIAogLyoqCiAgKiBDdXN0b20ge0BsaW5rIFVzZXJBdXRoUHVibGljS2V5fSBpbXBsZW1lbnRhdGlvbiBmb3IgaGFuZGxpbmcgU1NIIGNvbmZpZwotICogUHVia2V5QWNjZXB0ZWRBbGdvcml0aG1zLgorICogUHVia2V5QWNjZXB0ZWRBbGdvcml0aG1zIGFuZCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBTU0ggYWdlbnQuCiAgKi8KIHB1YmxpYyBjbGFzcyBKR2l0UHVibGljS2V5QXV0aGVudGljYXRpb24gZXh0ZW5kcyBVc2VyQXV0aFB1YmxpY0tleSB7CiAKKwlwcml2YXRlIFNzaEFnZW50IGFnZW50OworCisJcHJpdmF0ZSBIb3N0Q29uZmlnRW50cnkgaG9zdENvbmZpZzsKKworCXByaXZhdGUgYm9vbGVhbiBhZGRLZXlzVG9BZ2VudDsKKworCXByaXZhdGUgYm9vbGVhbiBhc2tCZWZvcmVBZGRpbmc7CisKKwlwcml2YXRlIFN0cmluZyBza1Byb3ZpZGVyOworCisJcHJpdmF0ZSBTc2hBZ2VudEtleUNvbnN0cmFpbnRbXSBjb25zdHJhaW50czsKKwogCUpHaXRQdWJsaWNLZXlBdXRoZW50aWNhdGlvbihMaXN0PE5hbWVkRmFjdG9yeTxTaWduYXR1cmU+PiBmYWN0b3JpZXMpIHsKIAkJc3VwZXIoZmFjdG9yaWVzKTsKIAl9CkBAIC00Myw3ICs4Niw3IEBAIHB1YmxpYyB2b2lkIGluaXQoQ2xpZW50U2Vzc2lvbiByYXdTZXNzaW9uLCBTdHJpbmcgc2VydmljZSkKIAkJCQkJKyByYXdTZXNzaW9uLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKIAkJfQogCQlKR2l0Q2xpZW50U2Vzc2lvbiBzZXNzaW9uID0gKEpHaXRDbGllbnRTZXNzaW9uKSByYXdTZXNzaW9uOwotCQlIb3N0Q29uZmlnRW50cnkgaG9zdENvbmZpZyA9IHNlc3Npb24uZ2V0SG9zdENvbmZpZ0VudHJ5KCk7CisJCWhvc3RDb25maWcgPSBzZXNzaW9uLmdldEhvc3RDb25maWdFbnRyeSgpOwogCQkvLyBTZXQgc2lnbmF0dXJlIGFsZ29yaXRobXMgZm9yIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24KIAkJU3RyaW5nIHB1YmtleUFsZ29zID0gaG9zdENvbmZpZy5nZXRQcm9wZXJ0eShQVUJLRVlfQUNDRVBURURfQUxHT1JJVEhNUyk7CiAJCWlmICghU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChwdWJrZXlBbGdvcykpIHsKQEAgLTY0LDQ2ICsxMDcsMjkxIEBAIHB1YmxpYyB2b2lkIGluaXQoQ2xpZW50U2Vzc2lvbiByYXdTZXNzaW9uLCBTdHJpbmcgc2VydmljZSkKIAkJLy8gSWYgd2UgZG9uJ3Qgc2V0IHNpZ25hdHVyZSBmYWN0b3JpZXMgaGVyZSwgdGhlIGRlZmF1bHQgb25lcyBmcm9tIHRoZQogCQkvLyBzZXNzaW9uIHdpbGwgYmUgdXNlZC4KIAkJc3VwZXIuaW5pdChzZXNzaW9uLCBzZXJ2aWNlKTsKLQkJLy8gSW4gc3NoZCAyLjcuMCwgd2UgZW5kIHVwIG5vdyB3aXRoIGEga2V5IGl0ZXJhdG9yIHRoYXQgdXNlcyBrZXlzCi0JCS8vIHByb3ZpZGVkIGJ5IGFuIHNzaC1hZ2VudCBldmVuIGlmIElkZW50aXRpZXNPbmx5IGlzIHRydWUuIFNvIGlmCi0JCS8vIG5lZWRlZCwgZmlsdGVyIG91dCBhbnkgS2V5QWdlbnRJZGVudGl0eS4KLQkJaWYgKGhvc3RDb25maWcuaXNJZGVudGl0aWVzT25seSgpKSB7Ci0JCQlJdGVyYXRvcjxQdWJsaWNLZXlJZGVudGl0eT4gb3JpZ2luYWwgPSBrZXlzOwotCQkJLy8gVGhlIG9yaWdpbmFsIGl0ZXJhdG9yIHdpbGwgYWxyZWFkeSBoYXZlIGdvdHRlbiB0aGUgaWRlbnRpdGllcwotCQkJLy8gZnJvbSB0aGUgYWdlbnQuIFVuZm9ydHVuYXRlbHkgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dAotCQkJLy8gdGhhdDsgaXQnbGwgaGF2ZSB0byBiZSBmaXhlZCB1cHN0cmVhbS4gKEFzIHdpbGwsIHVsdGltYXRlbHksCi0JCQkvLyByZXNwZWN0aW5nIGlzSWRlbnRpdGllc09ubHkoKS4pIEF0IGxlYXN0IHdlIGNhbiBzaW1wbHkgbm90Ci0JCQkvLyB1c2UgdGhlIGtleXMgdGhlIGFnZW50IHByb3ZpZGVkLgotCQkJLy8KLQkJCS8vIFNlZSBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1NTSEQtMTIxOAotCQkJa2V5cyA9IG5ldyBJdGVyYXRvcjw+KCkgeworCX0KIAotCQkJCXByaXZhdGUgUHVibGljS2V5SWRlbnRpdHkgdmFsdWU7CisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEl0ZXJhdG9yPFB1YmxpY0tleUlkZW50aXR5PiBjcmVhdGVQdWJsaWNLZXlJdGVyYXRvcigKKwkJCUNsaWVudFNlc3Npb24gc2Vzc2lvbiwgU2lnbmF0dXJlRmFjdG9yaWVzTWFuYWdlciBtYW5hZ2VyKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFnZW50ID0gZ2V0QWdlbnQoc2Vzc2lvbik7CisJCWlmIChhZ2VudCAhPSBudWxsKSB7CisJCQlwYXJzZUFkZEtleXMoaG9zdENvbmZpZyk7CisJCQlpZiAoYWRkS2V5c1RvQWdlbnQpIHsKKwkJCQlza1Byb3ZpZGVyID0gaG9zdENvbmZpZy5nZXRQcm9wZXJ0eShTc2hDb25zdGFudHMuU0VDVVJJVFlfS0VZX1BST1ZJREVSKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbmV3IEtleUl0ZXJhdG9yKHNlc3Npb24sIG1hbmFnZXIpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBQdWJsaWNLZXlJZGVudGl0eSByZXNvbHZlQXR0ZW1wdGVkUHVibGljS2V5SWRlbnRpdHkoCisJCQlDbGllbnRTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUHVibGljS2V5SWRlbnRpdHkgcmVzdWx0ID0gZ2V0TmV4dEtleShzZXNzaW9uLCBzZXJ2aWNlKTsKKwkJLy8gVGhpcyBmaXhlcyBTU0hELTEyMzEuIENhbiBiZSByZW1vdmVkIG9uY2Ugd2UncmUgdXNpbmcgQXBhY2hlIE1JTkEKKwkJLy8gc3NoZCA+IDIuOC4wLgorCQkvLworCQkvLyBTZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9TU0hELTEyMzEKKwkJY3VycmVudEFsZ29yaXRobXMuY2xlYXIoKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIFB1YmxpY0tleUlkZW50aXR5IGdldE5leHRLZXkoQ2xpZW50U2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgc2VydmljZSkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlQdWJsaWNLZXlJZGVudGl0eSBpZCA9IHN1cGVyLnJlc29sdmVBdHRlbXB0ZWRQdWJsaWNLZXlJZGVudGl0eShzZXNzaW9uLAorCQkJCXNlcnZpY2UpOworCQlpZiAoYWRkS2V5c1RvQWdlbnQgJiYgaWQgIT0gbnVsbCAmJiAhKGlkIGluc3RhbmNlb2YgS2V5QWdlbnRJZGVudGl0eSkpIHsKKwkJCUtleVBhaXIga2V5ID0gaWQuZ2V0S2V5SWRlbnRpdHkoKTsKKwkJCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkuZ2V0UHVibGljKCkgIT0gbnVsbAorCQkJCQkmJiBrZXkuZ2V0UHJpdmF0ZSgpICE9IG51bGwpIHsKKwkJCQkvLyBXZSd2ZSBqdXN0IHN1Y2Nlc3NmdWxseSBsb2FkZWQgYSBrZXkgdGhhdCB3YXNuJ3QgaW4gdGhlCisJCQkJLy8gYWdlbnQuIEFkZCBpdCB0byB0aGUgYWdlbnQuCisJCQkJLy8KKwkJCQkvLyBLZXlzIGFyZSBhZGRlZCBhZnRlciBsb2FkaW5nLCBhcyBpbiBPcGVuU1NILiBUaGUgYWx0ZXJuYXRpdmUKKwkJCQkvLyBtaWdodCBiZSB0byBhZGQgYSBrZXkgb25seSBhZnRlciAocGFydGlhbGx5KSBzdWNjZXNzZnVsCisJCQkJLy8gYXV0aGVudGljYXRpb24/CisJCQkJUHVibGljS2V5IHBrID0ga2V5LmdldFB1YmxpYygpOworCQkJCVN0cmluZyBmaW5nZXJwcmludCA9IEtleVV0aWxzLmdldEZpbmdlclByaW50KHBrKTsKKwkJCQlTdHJpbmcga2V5VHlwZSA9IEtleVV0aWxzLmdldEtleVR5cGUoa2V5KTsKKwkJCQl0cnkgeworCQkJCQkvLyBDaGVjayB0aGF0IHRoZSBrZXkgaXMgbm90IGluIHRoZSBhZ2VudCBhbHJlYWR5LgorCQkJCQlpZiAoYWdlbnRIYXNLZXkocGspKSB7CisJCQkJCQlyZXR1cm4gaWQ7CisJCQkJCX0KKwkJCQkJaWYgKGFza0JlZm9yZUFkZGluZworCQkJCQkJCSYmIChzZXNzaW9uIGluc3RhbmNlb2YgSkdpdENsaWVudFNlc3Npb24pKSB7CisJCQkJCQlDcmVkZW50aWFsc1Byb3ZpZGVyIHByb3ZpZGVyID0gKChKR2l0Q2xpZW50U2Vzc2lvbikgc2Vzc2lvbikKKwkJCQkJCQkJLmdldENyZWRlbnRpYWxzUHJvdmlkZXIoKTsKKwkJCQkJCUNyZWRlbnRpYWxJdGVtLlllc05vVHlwZSBxdWVzdGlvbiA9IG5ldyBDcmVkZW50aWFsSXRlbS5ZZXNOb1R5cGUoCisJCQkJCQkJCWZvcm1hdChTc2hkVGV4dAorCQkJCQkJCQkJCS5nZXQoKS5wdWJrZXlBdXRoQWRkS2V5VG9BZ2VudFF1ZXN0aW9uLAorCQkJCQkJCQkJCWtleVR5cGUsIGZpbmdlcnByaW50KSk7CisJCQkJCQlib29sZWFuIHJlc3VsdCA9IHByb3ZpZGVyICE9IG51bGwKKwkJCQkJCQkJJiYgcHJvdmlkZXIuc3VwcG9ydHMocXVlc3Rpb24pCisJCQkJCQkJCSYmIHByb3ZpZGVyLmdldChnZXRVcmkoKSwgcXVlc3Rpb24pOworCQkJCQkJaWYgKCFyZXN1bHQgfHwgIXF1ZXN0aW9uLmdldFZhbHVlKCkpIHsKKwkJCQkJCQkvLyBEb24ndCBhZGQgdGhlIGtleS4KKwkJCQkJCQlyZXR1cm4gaWQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJU3NoQWdlbnRLZXlDb25zdHJhaW50W10gcnVsZXMgPSBjb25zdHJhaW50czsKKwkJCQkJaWYgKHBrIGluc3RhbmNlb2YgU2VjdXJpdHlLZXlQdWJsaWNLZXkgJiYgIVN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoc2tQcm92aWRlcikpIHsKKwkJCQkJCXJ1bGVzID0gQXJyYXlzLmNvcHlPZihydWxlcywgcnVsZXMubGVuZ3RoICsgMSk7CisJCQkJCQlydWxlc1tydWxlcy5sZW5ndGggLSAxXSA9CisJCQkJCQkJCW5ldyBTc2hBZ2VudEtleUNvbnN0cmFpbnQuRmlkb1Byb3ZpZGVyRXh0ZW5zaW9uKHNrUHJvdmlkZXIpOworCQkJCQl9CisJCQkJCS8vIFVuZm9ydHVuYXRlbHkgYSBjb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGlzIGxvc3QKKwkJCQkJLy8gYnkgQXBhY2hlIE1JTkEgc3NoZCwgYW5kIHRoZXJlIGlzIGFsc28gbm8gd2F5IHRvIGdldCB0aGUKKwkJCQkJLy8gb3JpZ2luYWwgZmlsZSBuYW1lIGZvciBrZXlzIGxvYWRlZCBmcm9tIGEgZmlsZS4gU28gYWRkIGl0CisJCQkJCS8vIHdpdGhvdXQgY29tbWVudC4KKwkJCQkJYWdlbnQuYWRkSWRlbnRpdHkoa2V5LCBudWxsLCBydWxlcyk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBEbyBub3QgcmUtdGhyb3c6IHdlIGRvbid0IHdhbnQgYXV0aGVudGljYXRpb24gdG8gZmFpbCBpZgorCQkJCQkvLyB3ZSBjYW5ub3QgYWRkIHRoZSBrZXkgdG8gdGhlIGFnZW50LgorCQkJCQlsb2cuZXJyb3IoCisJCQkJCQkJZm9ybWF0KFNzaGRUZXh0LmdldCgpLnB1YmtleUF1dGhBZGRLZXlUb0FnZW50RXJyb3IsCisJCQkJCQkJCQlrZXlUeXBlLCBmaW5nZXJwcmludCksCisJCQkJCQkJZSk7CisJCQkJCS8vIE5vdGUgdGhhdCBhcyBvZiBXaW4zMi1PcGVuU1NIIDguNiBhbmQgUGFnZWFudCAwLjc2LAorCQkJCQkvLyBuZWl0aGVyIGNhbiBoYW5kbGUga2V5IGNvbnN0cmFpbnRzLiBQYWdlYW50IGZhaWxzCisJCQkJCS8vIGdyYWNlZnVsbHksIG5vdCBhZGRpbmcgdGhlIGtleSBhbmQgcmV0dXJuaW5nCisJCQkJCS8vIFNTSF9BR0VOVF9GQUlMVVJFLiBXaW4zMi1PcGVuU1NIIGNsb3NlcyB0aGUgY29ubmVjdGlvbgorCQkJCQkvLyB3aXRob3V0IGV2ZW4gcmV0dXJuaW5nIGEgZmFpbHVyZSBtZXNzYWdlLCB3aGljaCB2aW9sYXRlcworCQkJCQkvLyB0aGUgU1NIIGFnZW50IHByb3RvY29sIGFuZCBtYWtlcyBhbGwgc3Vic2VxdWVudCByZXF1ZXN0cworCQkJCQkvLyB0byB0aGUgYWdlbnQgZmFpbC4KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGlkOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBhZ2VudEhhc0tleShQdWJsaWNLZXkgcGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUl0ZXJhYmxlPD8gZXh0ZW5kcyBNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+PiBpZHMgPSBhZ2VudAorCQkJCS5nZXRJZGVudGl0aWVzKCk7CisJCWlmIChpZHMgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+PiBpdGVyID0gaWRzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJaWYgKEtleVV0aWxzLmNvbXBhcmVLZXlzKGl0ZXIubmV4dCgpLmdldEtleSgpLCBwaykpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBVUklpc2ggZ2V0VXJpKCkgeworCQlTdHJpbmcgdXJpID0gU3NoQ29uc3RhbnRzLlNTSF9TQ0hFTUUgKyAiOi8vIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgdXNlck5hbWUgPSBob3N0Q29uZmlnLmdldFVzZXJuYW1lKCk7CisJCWlmICghU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbCh1c2VyTmFtZSkpIHsKKwkJCXVyaSArPSB1c2VyTmFtZSArICdAJzsKKwkJfQorCQl1cmkgKz0gaG9zdENvbmZpZy5nZXRIb3N0KCk7CisJCWludCBwb3J0ID0gaG9zdENvbmZpZy5nZXRQb3J0KCk7CisJCWlmIChwb3J0ID4gMCAmJiBwb3J0ICE9IFNzaENvbnN0YW50cy5TU0hfREVGQVVMVF9QT1JUKSB7CisJCQl1cmkgKz0gIjoiICsgcG9ydDsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IFVSSWlzaCh1cmkpOworCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworCQkJbG9nLmVycm9yKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsKKwkJfQorCQlyZXR1cm4gbmV3IFVSSWlzaCgpOworCX0KKworCXByaXZhdGUgU3NoQWdlbnQgZ2V0QWdlbnQoQ2xpZW50U2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmFjdG9yeU1hbmFnZXIgbWFuYWdlciA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoCisJCQkJc2Vzc2lvbi5nZXRGYWN0b3J5TWFuYWdlcigpLCAiTm8gc2Vzc2lvbiBmYWN0b3J5IG1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAorCQlTc2hBZ2VudEZhY3RvcnkgZmFjdG9yeSA9IG1hbmFnZXIuZ2V0QWdlbnRGYWN0b3J5KCk7CisJCWlmIChmYWN0b3J5ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUNsaWVudChzZXNzaW9uLCBtYW5hZ2VyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcGFyc2VBZGRLZXlzKEhvc3RDb25maWdFbnRyeSBjb25maWcpIHsKKwkJU3RyaW5nIHZhbHVlID0gY29uZmlnLmdldFByb3BlcnR5KFNzaENvbnN0YW50cy5BRERfS0VZU19UT19BR0VOVCk7CisJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKHZhbHVlKSkgeworCQkJYWRkS2V5c1RvQWdlbnQgPSBmYWxzZTsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmdbXSB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgiLCIpOyAvLyROT04tTkxTLTEkCisJCUxpc3Q8U3NoQWdlbnRLZXlDb25zdHJhaW50PiBydWxlcyA9IG5ldyBBcnJheUxpc3Q8PigyKTsKKwkJc3dpdGNoICh2YWx1ZXNbMF0pIHsKKwkJY2FzZSAieWVzIjogLy8kTk9OLU5MUy0xJAorCQkJYWRkS2V5c1RvQWdlbnQgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgIm5vIjogLy8kTk9OLU5MUy0xJAorCQkJYWRkS2V5c1RvQWdlbnQgPSBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlICJhc2siOiAvLyROT04tTkxTLTEkCisJCQlhZGRLZXlzVG9BZ2VudCA9IHRydWU7CisJCQlhc2tCZWZvcmVBZGRpbmcgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgImNvbmZpcm0iOiAvLyROT04tTkxTLTEkCisJCQlhZGRLZXlzVG9BZ2VudCA9IHRydWU7CisJCQlydWxlcy5hZGQoU3NoQWdlbnRLZXlDb25zdHJhaW50LkNPTkZJUk0pOworCQkJaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7CisJCQkJaW50IHNlY29uZHMgPSBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYyh2YWx1ZXNbMV0pOworCQkJCWlmIChzZWNvbmRzID4gMCkgeworCQkJCQlydWxlcy5hZGQobmV3IFNzaEFnZW50S2V5Q29uc3RyYWludC5MaWZlVGltZShzZWNvbmRzKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpbnQgc2Vjb25kcyA9IE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKHZhbHVlc1swXSk7CisJCQlpZiAoc2Vjb25kcyA+IDApIHsKKwkJCQlhZGRLZXlzVG9BZ2VudCA9IHRydWU7CisJCQkJcnVsZXMuYWRkKG5ldyBTc2hBZ2VudEtleUNvbnN0cmFpbnQuTGlmZVRpbWUoc2Vjb25kcykpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY29uc3RyYWludHMgPSBydWxlcy50b0FycmF5KG5ldyBTc2hBZ2VudEtleUNvbnN0cmFpbnRbMF0pOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VLZXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJYWRkS2V5c1RvQWdlbnQgPSBmYWxzZTsKKwkJYXNrQmVmb3JlQWRkaW5nID0gZmFsc2U7CisJCXNrUHJvdmlkZXIgPSBudWxsOworCQljb25zdHJhaW50cyA9IG51bGw7CisJCXRyeSB7CisJCQlpZiAoYWdlbnQgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWFnZW50LmNsb3NlKCk7CisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJYWdlbnQgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXN1cGVyLnJlbGVhc2VLZXlzKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIGNsYXNzIEtleUl0ZXJhdG9yIGV4dGVuZHMgVXNlckF1dGhQdWJsaWNLZXlJdGVyYXRvciB7CisKKwkJcHJpdmF0ZSBJdGVyYWJsZTw/IGV4dGVuZHMgTWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPj4gYWdlbnRLZXlzOworCisJCS8vIElmIG5vbi1udWxsLCBhbGwgdGhlIHB1YmxpYyBrZXlzIGZyb20gZXhwbGljaXRseSBnaXZlbiBrZXkgZmlsZXMuIEFueQorCQkvLyBhZ2VudCBrZXkgbm90IG1hdGNoaW5nIG9uZSBvZiB0aGVzZSBwdWJsaWMga2V5cyB3aWxsIGJlIGlnbm9yZWQgaW4KKwkJLy8gZ2V0SWRlbnRpdGllcygpLgorCQlwcml2YXRlIENvbGxlY3Rpb248UHVibGljS2V5PiBpZGVudGl0eUZpbGVzOworCisJCXB1YmxpYyBLZXlJdGVyYXRvcihDbGllbnRTZXNzaW9uIHNlc3Npb24sCisJCQkJU2lnbmF0dXJlRmFjdG9yaWVzTWFuYWdlciBtYW5hZ2VyKQorCQkJCXRocm93cyBFeGNlcHRpb24geworCQkJc3VwZXIoc2Vzc2lvbiwgbWFuYWdlcik7CisJCX0KKworCQlwcml2YXRlIExpc3Q8UHVibGljS2V5PiBnZXRFeHBsaWNpdEtleXMoCisJCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGxpY2l0RmlsZXMpIHsKKwkJCWlmIChleHBsaWNpdEZpbGVzID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXJldHVybiBleHBsaWNpdEZpbGVzLnN0cmVhbSgpLm1hcChzIC0+IHsKKwkJCQl0cnkgeworCQkJCQlQYXRoIHAgPSBQYXRocy5nZXQocyArICIucHViIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKEZpbGVzLmlzUmVndWxhckZpbGUocCwgTGlua09wdGlvbi5OT0ZPTExPV19MSU5LUykpIHsKKwkJCQkJCXJldHVybiBBdXRob3JpemVkS2V5RW50cnkucmVhZEF1dGhvcml6ZWRLZXlzKHApLmdldCgwKQorCQkJCQkJCQkucmVzb2x2ZVB1YmxpY0tleShudWxsLAorCQkJCQkJCQkJCVB1YmxpY0tleUVudHJ5UmVzb2x2ZXIuSUdOT1JJTkcpOworCQkJCQl9CisJCQkJfSBjYXRjaCAoSW52YWxpZFBhdGhFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbgorCQkJCQkJfCBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gZSkgeworCQkJCQlsb2cud2Fybihmb3JtYXQoU3NoZFRleHQuZ2V0KCkuY2Fubm90UmVhZFB1YmxpY0tleSwgcyksIGUpOworCQkJCX0KKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0pLmZpbHRlcihPYmplY3RzOjpub25OdWxsKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBJdGVyYWJsZTxLZXlBZ2VudElkZW50aXR5PiBpbml0aWFsaXplQWdlbnRJZGVudGl0aWVzKAorCQkJCUNsaWVudFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCWlmIChhZ2VudCA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlhZ2VudEtleXMgPSBhZ2VudC5nZXRJZGVudGl0aWVzKCk7CisJCQlpZiAoaG9zdENvbmZpZyAhPSBudWxsICYmIGhvc3RDb25maWcuaXNJZGVudGl0aWVzT25seSgpKSB7CisJCQkJaWRlbnRpdHlGaWxlcyA9IGdldEV4cGxpY2l0S2V5cyhob3N0Q29uZmlnLmdldElkZW50aXRpZXMoKSk7CisJCQl9CisJCQlyZXR1cm4gKCkgLT4gbmV3IEl0ZXJhdG9yPD4oKSB7CisKKwkJCQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+PiBpdGVyID0gYWdlbnRLZXlzCisJCQkJCQkuaXRlcmF0b3IoKTsKKworCQkJCXByaXZhdGUgTWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPiBuZXh0OwogCiAJCQkJQE92ZXJyaWRlCiAJCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCVB1YmxpY0tleUlkZW50aXR5IG5leHQgPSBudWxsOwotCQkJCQl3aGlsZSAob3JpZ2luYWwuaGFzTmV4dCgpKSB7Ci0JCQkJCQluZXh0ID0gb3JpZ2luYWwubmV4dCgpOwotCQkJCQkJaWYgKCEobmV4dCBpbnN0YW5jZW9mIEtleUFnZW50SWRlbnRpdHkpKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXh0OworCQkJCQl3aGlsZSAobmV4dCA9PSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJCQlNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+IHZhbCA9IGl0ZXIubmV4dCgpOworCQkJCQkJUHVibGljS2V5IHBrID0gdmFsLmdldEtleSgpOworCQkJCQkJLy8gVGhpcyBjaGVja3MgYWdhaW5zdCBhbGwgZXhwbGljaXQga2V5cyBmb3IgYW55IGFnZW50CisJCQkJCQkvLyBrZXksIGJ1dCBzaW5jZSBpZGVudGl0eUZpbGVzLnNpemUoKSBpcyB0eXBpY2FsbHkgMSwKKwkJCQkJCS8vIGl0IHNob3VsZCBiZSBmaW5lLgorCQkJCQkJaWYgKGlkZW50aXR5RmlsZXMgPT0gbnVsbCB8fCBpZGVudGl0eUZpbGVzLnN0cmVhbSgpCisJCQkJCQkJCS5hbnlNYXRjaChrIC0+IEtleVV0aWxzLmNvbXBhcmVLZXlzKGssIHBrKSkpIHsKKwkJCQkJCQluZXh0ID0gdmFsOwogCQkJCQkJCXJldHVybiB0cnVlOwogCQkJCQkJfQorCQkJCQkJaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisJCQkJCQkJbG9nLnRyYWNlKAorCQkJCQkJCQkJIklnbm9yaW5nIFNTSCBhZ2VudCB7fSBrZXkgbm90IGluIGV4cGxpY2l0IElkZW50aXR5RmlsZSBpbiBTU0ggY29uZmlnOiB7fSIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCUtleVV0aWxzLmdldEtleVR5cGUocGspLAorCQkJCQkJCQkJS2V5VXRpbHMuZ2V0RmluZ2VyUHJpbnQocGspKTsKKwkJCQkJCX0KIAkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCXJldHVybiBuZXh0ICE9IG51bGw7CiAJCQkJfQogCiAJCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFB1YmxpY0tleUlkZW50aXR5IG5leHQoKSB7Ci0JCQkJCWlmIChoYXNOZXh0KCkpIHsKLQkJCQkJCVB1YmxpY0tleUlkZW50aXR5IHJlc3VsdCA9IHZhbHVlOwotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQlwdWJsaWMgS2V5QWdlbnRJZGVudGl0eSBuZXh0KCkgeworCQkJCQlpZiAoIWhhc05leHQoKSkgeworCQkJCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKIAkJCQkJfQotCQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCQkJCQlLZXlBZ2VudElkZW50aXR5IHJlc3VsdCA9IG5ldyBLZXlBZ2VudElkZW50aXR5KGFnZW50LAorCQkJCQkJCW5leHQuZ2V0S2V5KCksIG5leHQuZ2V0VmFsdWUoKSk7CisJCQkJCW5leHQgPSBudWxsOworCQkJCQlyZXR1cm4gcmVzdWx0OwogCQkJCX0KIAkJCX07CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9Tc2hkVGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL1NzaGRUZXh0LmphdmEKaW5kZXggMDBlZTYyZC4uMTlhZDg1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL1NzaGRUZXh0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL1NzaGRUZXh0LmphdmEKQEAgLTMwLDYgKzMwLDcgQEAgcHVibGljIHN0YXRpYyBTc2hkVGV4dCBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBhdXRoZW50aWNhdGlvbkNhbmNlbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgYXV0aGVudGljYXRpb25PbkNsb3NlZFNlc3Npb247CiAJLyoqKi8gcHVibGljIFN0cmluZyBjbG9zZUxpc3RlbmVyRmFpbGVkOworCS8qKiovIHB1YmxpYyBTdHJpbmcgY2Fubm90UmVhZFB1YmxpY0tleTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGNvbmZpZ0ludmFsaWRQYXRoOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgY29uZmlnSW52YWxpZFBhdHRlcm47CiAJLyoqKi8gcHVibGljIFN0cmluZyBjb25maWdJbnZhbGlkUG9zaXRpdmU7CkBAIC05OCw2ICs5OSw4IEBAIHB1YmxpYyBzdGF0aWMgU3NoZFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHJveHlTb2Nrc1VuZXhwZWN0ZWRNZXNzYWdlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHJveHlTb2Nrc1VuZXhwZWN0ZWRWZXJzaW9uOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHJveHlTb2Nrc1VzZXJuYW1lVG9vTG9uZzsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHB1YmtleUF1dGhBZGRLZXlUb0FnZW50RXJyb3I7CisJLyoqKi8gcHVibGljIFN0cmluZyBwdWJrZXlBdXRoQWRkS2V5VG9BZ2VudFF1ZXN0aW9uOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVia2V5QXV0aFdyb25nQ29tbWFuZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1YmtleUF1dGhXcm9uZ0tleTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1YmtleUF1dGhXcm9uZ1NpZ25hdHVyZUFsZ29yaXRobTsKQEAgLTEwNiw5ICsxMDksMTMgQEAgcHVibGljIHN0YXRpYyBTc2hkVGV4dCBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzZXJ2ZXJJZFdpdGhOdWw7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzZXNzaW9uQ2xvc2VGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzZXNzaW9uV2l0aG91dFVzZXJuYW1lOworCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQWdlbnRFZERTQUZvcm1hdEVycm9yOworCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQWdlbnRQYXlsb2FkTGVuZ3RoRXJyb3I7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2hBZ2VudFJlcGx5TGVuZ3RoRXJyb3I7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2hBZ2VudFJlcGx5VW5leHBlY3RlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaEFnZW50U2hvcnRSZWFkQnVmZmVyOworCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQWdlbnRVbmtub3duS2V5OworCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NoQWdlbnRXcm9uZ0tleUxlbmd0aDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaEFnZW50V3JvbmdOdW1iZXJPZktleXM7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2hDbG9zaW5nRG93bjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaENvbW1hbmRUaW1lb3V0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L0pHaXRTc2hBZ2VudEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9KR2l0U3NoQWdlbnRGYWN0b3J5LmphdmEKaW5kZXggMWVkMmFiOS4uYTBmZmQ1NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L0pHaXRTc2hBZ2VudEZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaGQvYWdlbnQvSkdpdFNzaEFnZW50RmFjdG9yeS5qYXZhCkBAIC0xNywxMCArMTcsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmFnZW50LlNzaEFnZW50RmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnRTZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNsaWVudC5jb25maWcuaG9zdHMuSG9zdENvbmZpZ0VudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uRmFjdG9yeU1hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi5jaGFubmVsLkNoYW5uZWxGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbi5Db25uZWN0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnNlc3Npb24uU2Vzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5KR2l0Q2xpZW50U2Vzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Tc2hDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuc3NoZC5hZ2VudC5Db25uZWN0b3JGYWN0b3J5OwogCiAvKioKQEAgLTQ5LDE4ICs1MywyNCBAQCBwdWJsaWMgSkdpdFNzaEFnZW50RmFjdG9yeShATm9uTnVsbCBDb25uZWN0b3JGYWN0b3J5IGZhY3RvcnksCiAJQE92ZXJyaWRlCiAJcHVibGljIExpc3Q8Q2hhbm5lbEZhY3Rvcnk+IGdldENoYW5uZWxGb3J3YXJkaW5nRmFjdG9yaWVzKAogCQkJRmFjdG9yeU1hbmFnZXIgbWFuYWdlcikgewotCQkvLyBObyBhZ2VudCBmb3J3YXJkaW5nIHN1cHBvcnRlZCB5ZXQuCisJCS8vIE5vIGFnZW50IGZvcndhcmRpbmcgc3VwcG9ydGVkLgogCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAJfQogCiAJQE92ZXJyaWRlCi0JcHVibGljIFNzaEFnZW50IGNyZWF0ZUNsaWVudChGYWN0b3J5TWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBzc2hkIDIuOC4wIHdpbGwgcGFzcyB1cyB0aGUgc2Vzc2lvbiBoZXJlLiBBdCB0aGF0IHBvaW50LCB3ZSBjYW4gZ2V0Ci0JCS8vIHRoZSBIb3N0Q29uZmlnRW50cnkgYW5kIGV4dHJhY3QgYW5kIGhhbmRsZSB0aGUgSWRlbnRpdHlBZ2VudCBzZXR0aW5nLgotCQkvLyBGb3Igbm93LCBwYXNzIG51bGwgdG8gbGV0IHRoZSBDb25uZWN0b3JGYWN0b3J5IGRvIGl0cyBkZWZhdWx0Ci0JCS8vIGJlaGF2aW9yIChQYWdlYW50IG9uIFdpbmRvd3MsIFNTSF9BVVRIX1NPQ0sgb24gVW5peGVzIHdpdGggdGhlCi0JCS8vIGpnaXQtYnVpbHRpbiBmYWN0b3J5KS4KLQkJcmV0dXJuIG5ldyBTc2hBZ2VudENsaWVudChmYWN0b3J5LmNyZWF0ZShudWxsLCBob21lRGlyKSk7CisJcHVibGljIFNzaEFnZW50IGNyZWF0ZUNsaWVudChTZXNzaW9uIHNlc3Npb24sIEZhY3RvcnlNYW5hZ2VyIG1hbmFnZXIpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgaWRlbnRpdHlBZ2VudCA9IG51bGw7CisJCWlmIChzZXNzaW9uIGluc3RhbmNlb2YgSkdpdENsaWVudFNlc3Npb24pIHsKKwkJCUhvc3RDb25maWdFbnRyeSBob3N0Q29uZmlnID0gKChKR2l0Q2xpZW50U2Vzc2lvbikgc2Vzc2lvbikKKwkJCQkJLmdldEhvc3RDb25maWdFbnRyeSgpOworCQkJaWRlbnRpdHlBZ2VudCA9IGhvc3RDb25maWcuZ2V0UHJvcGVydHkoU3NoQ29uc3RhbnRzLklERU5USVRZX0FHRU5ULAorCQkJCQludWxsKTsKKwkJfQorCQlpZiAoU3NoQ29uc3RhbnRzLk5PTkUuZXF1YWxzKGlkZW50aXR5QWdlbnQpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gbmV3IFNzaEFnZW50Q2xpZW50KGZhY3RvcnkuY3JlYXRlKGlkZW50aXR5QWdlbnQsIGhvbWVEaXIpKTsKIAl9CiAKIAlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoZC9hZ2VudC9Tc2hBZ2VudENsaWVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L1NzaEFnZW50Q2xpZW50LmphdmEKaW5kZXggMDg0ODNlNC4uY2JjYjRkMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L1NzaEFnZW50Q2xpZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2hkL2FnZW50L1NzaEFnZW50Q2xpZW50LmphdmEKQEAgLTExLDEwICsxMSwxMiBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0yMiwyMSArMjQsMjcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5hZ2VudC5Tc2hBZ2VudDsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuYWdlbnQuU3NoQWdlbnRDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmFnZW50LlNzaEFnZW50S2V5Q29uc3RyYWludDsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLlNzaEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLmNvbmZpZy5rZXlzLktleVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24ua2V5cHJvdmlkZXIuS2V5UGFpclByb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24uc2Vzc2lvbi5TZXNzaW9uQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyLkJ1ZmZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyLkJ1ZmZlckV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLnV0aWwuYnVmZmVyLkJ1ZmZlclV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXIuQnl0ZUFycmF5QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5jb21tb24udXRpbC5idWZmZXIua2V5cy5CdWZmZXJQdWJsaWNLZXlQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLmNvbW1vbi51dGlsLmlvLmRlci5ERVJQYXJzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoZC5Tc2hkVGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5zc2hkLmFnZW50LkNvbm5lY3RvcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiAvKioKLSAqIEEgY2xpZW50IGZvciBhbiBTU0gyIGFnZW50LiBUaGlzIGNsaWVudCBzdXBwb3J0cyBvbmx5IHF1ZXJ5aW5nIGlkZW50aXRpZXMgYW5kCi0gKiBzaWduYXR1cmUgcmVxdWVzdHMuCisgKiBBIGNsaWVudCBmb3IgYW4gU1NIMiBhZ2VudC4gVGhpcyBjbGllbnQgc3VwcG9ydHMgcXVlcnlpbmcgaWRlbnRpdGllcywKKyAqIHNpZ25hdHVyZSByZXF1ZXN0cywgYW5kIGFkZGluZyBrZXlzIHRvIGFuIGFnZW50ICh3aXRoIG9yIHdpdGhvdXQKKyAqIGNvbnN0cmFpbnRzKS4gUmVtb3Zpbmcga2V5cyBpcyBub3Qgc3VwcG9ydGVkLCBhbmQgdGhlIG9sZGVyIFNTSDEgcHJvdG9jb2wgaXMKKyAqIG5vdCBzdXBwb3J0ZWQuCiAgKgogICogQHNlZSA8YSBocmVmPSJodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtbWlsbGVyLXNzaC1hZ2VudC0wNCI+U1NICiAgKiAgICAgIEFnZW50IFByb3RvY29sLCBSRkMgZHJhZnQ8L2E+CkBAIC03MiwxMSArODAsMTggQEAgcHJpdmF0ZSBib29sZWFuIG9wZW4oYm9vbGVhbiBkZWJ1Z2dpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl9CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KLQkJYm9vbGVhbiBjb25uZWN0ZWQgPSBjb25uZWN0b3IgIT0gbnVsbCAmJiBjb25uZWN0b3IuY29ubmVjdCgpOwotCQlpZiAoIWNvbm5lY3RlZCkgewotCQkJaWYgKGRlYnVnZ2luZykgewotCQkJCUxPRy5kZWJ1ZygiTm8gU1NIIGFnZW50IChTU0hfQVVUSF9TT0NLIG5vdCBzZXQpIik7IC8vJE5PTi1OTFMtMSQKKwkJYm9vbGVhbiBjb25uZWN0ZWQ7CisJCXRyeSB7CisJCQljb25uZWN0ZWQgPSBjb25uZWN0b3IgIT0gbnVsbCAmJiBjb25uZWN0b3IuY29ubmVjdCgpOworCQkJaWYgKCFjb25uZWN0ZWQgJiYgZGVidWdnaW5nKSB7CisJCQkJTE9HLmRlYnVnKCJObyBTU0ggYWdlbnQiKTsgLy8kTk9OLU5MUy0xJAogCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBBZ2VudCBub3QgcnVubmluZz8KKwkJCWlmIChkZWJ1Z2dpbmcpIHsKKwkJCQlMT0cuZGVidWcoIk5vIFNTSCBhZ2VudCIsIGUpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQl0aHJvdyBlOwogCQl9CiAJCXJldHVybiBjb25uZWN0ZWQ7CiAJfQpAQCAtMTI3LDE0ICsxNDIsMTcgQEAgcHVibGljIEl0ZXJhYmxlPD8gZXh0ZW5kcyBNYXAuRW50cnk8UHVibGljS2V5LCBTdHJpbmc+PiBnZXRJZGVudGl0aWVzKCkKIAkJCUxpc3Q8TWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPj4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8PigKIAkJCQkJbnVtYmVyT2ZLZXlzKTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZLZXlzOyBpKyspIHsKLQkJCQlQdWJsaWNLZXkga2V5ID0gcmVwbHkuZ2V0UHVibGljS2V5KCk7CisJCQkJUHVibGljS2V5IGtleSA9IHJlYWRLZXkocmVwbHkpOwogCQkJCVN0cmluZyBjb21tZW50ID0gcmVwbHkuZ2V0U3RyaW5nKCk7Ci0JCQkJaWYgKHRyYWNpbmcpIHsKLQkJCQkJTE9HLnRyYWNlKCJHb3QgU1NIIGFnZW50IHt9IGtleToge30ge30iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJS2V5VXRpbHMuZ2V0S2V5VHlwZShrZXkpLAotCQkJCQkJCUtleVV0aWxzLmdldEZpbmdlclByaW50KGtleSksIGNvbW1lbnQpOworCQkJCWlmIChrZXkgIT0gbnVsbCkgeworCQkJCQlpZiAodHJhY2luZykgeworCQkJCQkJTE9HLnRyYWNlKCJHb3QgU1NIIGFnZW50IHt9IGtleToge30ge30iLCAvLyROT04tTkxTLTEkCisJCQkJCQkJCUtleVV0aWxzLmdldEtleVR5cGUoa2V5KSwKKwkJCQkJCQkJS2V5VXRpbHMuZ2V0RmluZ2VyUHJpbnQoa2V5KSwgY29tbWVudCk7CisJCQkJCX0KKwkJCQkJa2V5cy5hZGQobmV3IEFic3RyYWN0TWFwLlNpbXBsZUltbXV0YWJsZUVudHJ5PD4oa2V5LAorCQkJCQkJCWNvbW1lbnQpKTsKIAkJCQl9Ci0JCQkJa2V5cy5hZGQobmV3IEFic3RyYWN0TWFwLlNpbXBsZUltbXV0YWJsZUVudHJ5PD4oa2V5LCBjb21tZW50KSk7CiAJCQl9CiAJCQlyZXR1cm4ga2V5czsKIAkJfSBjYXRjaCAoQnVmZmVyRXhjZXB0aW9uIGUpIHsKQEAgLTIxNiw2ICsyMzQsMjIyIEBAIHB1YmxpYyBJdGVyYWJsZTw/IGV4dGVuZHMgTWFwLkVudHJ5PFB1YmxpY0tleSwgU3RyaW5nPj4gZ2V0SWRlbnRpdGllcygpCiAJCX0KIAl9CiAKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhZGRJZGVudGl0eShLZXlQYWlyIGtleSwgU3RyaW5nIGNvbW1lbnQsCisJCQlTc2hBZ2VudEtleUNvbnN0cmFpbnQuLi4gY29uc3RyYWludHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWJvb2xlYW4gZGVidWdnaW5nID0gTE9HLmlzRGVidWdFbmFibGVkKCk7CisJCWlmICghb3BlbihkZWJ1Z2dpbmcpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBOZWl0aGVyIFBhZ2VhbnQgMC43NiBub3IgV2luMzItT3BlblNTSCA4LjYgc3VwcG9ydCBjb21tYW5kCisJCS8vIFNTSDJfQUdFTlRDX0FERF9JRF9DT05TVFJBSU5FRC4gQWRkaW5nIGEga2V5IHdpdGggY29uc3RyYWludHMgd2lsbAorCQkvLyBmYWlsLiBUaGUgb25seSB3b3JrLWFyb3VuZCBmb3IgdXNlcnMgaXMgbm90IHRvIHVzZSAiY29uZmlybSIgb3IgInRpbWUKKwkJLy8gc3BlYyIgd2l0aCBBZGRLZXlzVG9BZ2VudCwgYW5kIG5vdCB0byB1c2Ugc2stKiBrZXlzLgorCQkvLworCQkvLyBXaXRoIGEgdHJ1ZSBPcGVuU1NIIFNTSCBhZ2VudCwga2V5IGNvbnN0cmFpbnRzIHdvcmsuCisJCWJ5dGUgY21kID0gKGNvbnN0cmFpbnRzICE9IG51bGwgJiYgY29uc3RyYWludHMubGVuZ3RoID4gMCkKKwkJCQk/IFNzaEFnZW50Q29uc3RhbnRzLlNTSDJfQUdFTlRDX0FERF9JRF9DT05TVFJBSU5FRAorCQkJCTogU3NoQWdlbnRDb25zdGFudHMuU1NIMl9BR0VOVENfQUREX0lERU5USVRZOworCQlieXRlW10gbWVzc2FnZSA9IG51bGw7CisJCUJ5dGVBcnJheUJ1ZmZlciBtc2cgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKCk7CisJCXRyeSB7CisJCQltc2cucHV0SW50KDApOworCQkJbXNnLnB1dEJ5dGUoY21kKTsKKwkJCVN0cmluZyBrZXlUeXBlID0gS2V5VXRpbHMuZ2V0S2V5VHlwZShrZXkpOworCQkJaWYgKEtleVBhaXJQcm92aWRlci5TU0hfRUQyNTUxOS5lcXVhbHMoa2V5VHlwZSkpIHsKKwkJCQkvLyBBcGFjaGUgTUlOQSBzc2hkIDIuOC4wIGxhY2tzIHN1cHBvcnQgZm9yIHdyaXRpbmcgZWQyNTUxOQorCQkJCS8vIHByaXZhdGUga2V5cyB0byBhIGJ1ZmZlci4KKwkJCQlwdXRFZDI1NTE5S2V5KG1zZywga2V5KTsKKwkJCX0gZWxzZSB7CisJCQkJbXNnLnB1dEtleVBhaXIoa2V5KTsKKwkJCX0KKwkJCW1zZy5wdXRTdHJpbmcoY29tbWVudCA9PSBudWxsID8gIiIgOiBjb21tZW50KTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGNvbnN0cmFpbnRzICE9IG51bGwpIHsKKwkJCQlmb3IgKFNzaEFnZW50S2V5Q29uc3RyYWludCBjb25zdHJhaW50IDogY29uc3RyYWludHMpIHsKKwkJCQkJY29uc3RyYWludC5wdXQobXNnKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZGVidWdnaW5nKSB7CisJCQkJTE9HLmRlYnVnKAorCQkJCQkJImFkZElkZW50aXR5OiBhZGRpbmcge30ga2V5IHt9IHRvIFNTSCBhZ2VudDsgY29tbWVudCB7fSIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCWtleVR5cGUsIEtleVV0aWxzLmdldEZpbmdlclByaW50KGtleS5nZXRQdWJsaWMoKSksCisJCQkJCQljb21tZW50KTsKKwkJCX0KKwkJCW1lc3NhZ2UgPSBtc2cuZ2V0Q29tcGFjdERhdGEoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCS8vIFRoZSBtZXNzYWdlIGNvbnRhaW5zIHRoZSBwcml2YXRlIGtleSBkYXRhLCBzbyBjbGVhciBpbnRlcm1lZGlhcnkKKwkJCS8vIGRhdGEgQVNBUC4KKwkJCW1zZy5jbGVhcigpOworCQl9CisJCUJ1ZmZlciByZXBseTsKKwkJdHJ5IHsKKwkJCXJlcGx5ID0gcnBjKGNtZCwgbWVzc2FnZSk7CisJCX0gZmluYWxseSB7CisJCQlBcnJheXMuZmlsbChtZXNzYWdlLCAoYnl0ZSkgMCk7CisJCX0KKwkJaW50IHJlcGx5TGVuZ3RoID0gcmVwbHkuYXZhaWxhYmxlKCk7CisJCWlmIChyZXBseUxlbmd0aCAhPSAxKSB7CisJCQl0aHJvdyBuZXcgU3NoRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQlTc2hkVGV4dC5nZXQoKS5zc2hBZ2VudFJlcGx5VW5leHBlY3RlZCwKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJU3NoZFRleHQuZ2V0KCkuc3NoQWdlbnRQYXlsb2FkTGVuZ3RoRXJyb3IsCisJCQkJCQkJSW50ZWdlci52YWx1ZU9mKDEpLCBJbnRlZ2VyLnZhbHVlT2YocmVwbHlMZW5ndGgpKSkpOworCisJCX0KKwkJY21kID0gcmVwbHkuZ2V0Qnl0ZSgpOworCQlpZiAoY21kICE9IFNzaEFnZW50Q29uc3RhbnRzLlNTSF9BR0VOVF9TVUNDRVNTKSB7CisJCQl0aHJvdyBuZXcgU3NoRXhjZXB0aW9uKAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChTc2hkVGV4dC5nZXQoKS5zc2hBZ2VudFJlcGx5VW5leHBlY3RlZCwKKwkJCQkJCQlTc2hBZ2VudENvbnN0YW50cy5nZXRDb21tYW5kTWVzc2FnZU5hbWUoY21kKSkpOworCQl9CisJfQorCisJLyoqCisJICogV3JpdGVzIGFuIGVkMjU1MTkge0BsaW5rIEtleVBhaXJ9IHRvIGEge0BsaW5rIEJ1ZmZlcn0uIE9wZW5TU0ggc3BlY2lmaWVzCisJICogdGhhdCBpdCBleHBlY3RzIHRoZSAzMiBwdWJsaWMga2V5IGJ5dGVzLCBmb2xsb3dlZCBieSA2NCBieXRlcyBmb3JtZWQgYnkKKwkgKiBjb25jYXRlbmF0aW5nIHRoZSAzMiBwcml2YXRlIGtleSBieXRlcyB3aXRoIHRoZSAzMiBwdWJsaWMga2V5IGJ5dGVzLgorCSAqCisJICogQHBhcmFtIG1zZworCSAqICAgICAgICAgICAge0BsaW5rIEJ1ZmZlcn0gdG8gd3JpdGUgdG8KKwkgKiBAcGFyYW0ga2V5CisJICogICAgICAgICAgICB7QGxpbmsgS2V5UGFpcn0gdG8gd3JpdGUKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIHByaXZhdGUga2V5IGNhbm5vdCBiZSB3cml0dGVuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXRFZDI1NTE5S2V5KEJ1ZmZlciBtc2csIEtleVBhaXIga2V5KQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQnVmZmVyIHRtcCA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoMzYpOworCQl0bXAucHV0UmF3UHVibGljS2V5Qnl0ZXMoa2V5LmdldFB1YmxpYygpKTsKKwkJYnl0ZVtdIHB1YmxpY0J5dGVzID0gdG1wLmdldEJ5dGVzKCk7CisJCW1zZy5wdXRTdHJpbmcoS2V5UGFpclByb3ZpZGVyLlNTSF9FRDI1NTE5KTsKKwkJbXNnLnB1dEJ5dGVzKHB1YmxpY0J5dGVzKTsKKwkJLy8gTmV4dCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgMzIgYnl0ZSBwcml2YXRlIGtleSB2YWx1ZSB3aXRoIHRoZQorCQkvLyAzMiBieXRlcyBvZiB0aGUgcHVibGljIGtleS4KKwkJUHJpdmF0ZUtleSBwayA9IGtleS5nZXRQcml2YXRlKCk7CisJCVN0cmluZyBmb3JtYXQgPSBway5nZXRGb3JtYXQoKTsKKwkJaWYgKCEiUEtDUyM4Ii5lcXVhbHNJZ25vcmVDYXNlKGZvcm1hdCkpIHsgLy8kTk9OLU5MUy0xJAorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJLmZvcm1hdChTc2hkVGV4dC5nZXQoKS5zc2hBZ2VudEVkRFNBRm9ybWF0RXJyb3IsIGZvcm1hdCkpOworCQl9CisJCWJ5dGVbXSBwcml2YXRlQnl0ZXMgPSBudWxsOworCQlieXRlW10gZW5jb2RlZCA9IHBrLmdldEVuY29kZWQoKTsKKwkJdHJ5IHsKKwkJCXByaXZhdGVCeXRlcyA9IGFzbjFQYXJzZShlbmNvZGVkLCAzMik7CisJCQlieXRlW10gY29tYmluZWQgPSBBcnJheXMuY29weU9mKHByaXZhdGVCeXRlcywgNjQpOworCQkJQXJyYXlzLmZpbGwocHJpdmF0ZUJ5dGVzLCAoYnl0ZSkgMCk7CisJCQlwcml2YXRlQnl0ZXMgPSBjb21iaW5lZDsKKwkJCVN5c3RlbS5hcnJheWNvcHkocHVibGljQnl0ZXMsIDAsIHByaXZhdGVCeXRlcywgMzIsIDMyKTsKKwkJCW1zZy5wdXRCeXRlcyhwcml2YXRlQnl0ZXMpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKHByaXZhdGVCeXRlcyAhPSBudWxsKSB7CisJCQkJQXJyYXlzLmZpbGwocHJpdmF0ZUJ5dGVzLCAoYnl0ZSkgMCk7CisJCQl9CisJCQlBcnJheXMuZmlsbChlbmNvZGVkLCAoYnl0ZSkgMCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBFeHRyYWN0cyB0aGUgcHJpdmF0ZSBrZXkgYnl0ZXMgZnJvbSBhbiBlbmNvZGVkIGVkMjU1MTkgcHJpdmF0ZSBrZXkgYnkKKwkgKiBwYXJzaW5nIHRoZSBieXRlcyBhcyBBU04uMSBhY2NvcmRpbmcgdG8gUkZDIDU5NTggKFBLQ1MgIzggZW5jb2RpbmcpOgorCSAqCisJICogPHByZT4KKwkgKiBPbmVBc3ltbWV0cmljS2V5IDo6PSBTRVFVRU5DRSB7CisJICogICB2ZXJzaW9uIFZlcnNpb24sCisJICogICBwcml2YXRlS2V5QWxnb3JpdGhtIFByaXZhdGVLZXlBbGdvcml0aG1JZGVudGlmaWVyLAorCSAqICAgcHJpdmF0ZUtleSBQcml2YXRlS2V5LAorCSAqICAgLi4uCisJICogfQorCSAqCisJICogVmVyc2lvbiA6Oj0gSU5URUdFUgorCSAqIFByaXZhdGVLZXlBbGdvcml0aG1JZGVudGlmaWVyIDo6PSBBbGdvcml0aG1JZGVudGlmaWVyCisJICogUHJpdmF0ZUtleSA6Oj0gT0NURVQgU1RSSU5HCisJICoKKwkgKiBBbGdvcml0aG1JZGVudGlmaWVyICA6Oj0gIFNFUVVFTkNFICB7CisJICogICBhbGdvcml0aG0gICBPQkpFQ1QgSURFTlRJRklFUiwKKwkgKiAgIHBhcmFtZXRlcnMgIEFOWSBERUZJTkVEIEJZIGFsZ29yaXRobSBPUFRJT05BTAorCSAqIH0KKwkgKiA8L3ByZT4KKwkgKiA8cD4KKwkgKiBhbmQgUkZDIDg0MTA6ICIuLi4gd2hlbiBlbmNvZGluZyBhIE9uZUFzeW1tZXRyaWNLZXkgb2JqZWN0LCB0aGUgcHJpdmF0ZQorCSAqIGtleSBpcyB3cmFwcGVkIGluIGEgQ3VydmVQcml2YXRlS2V5IG9iamVjdCBhbmQgd3JhcHBlZCBieSB0aGUgT0NURVQKKwkgKiBTVFJJTkcgb2YgdGhlICdwcml2YXRlS2V5JyBmaWVsZC4iCisJICogPC9wPgorCSAqCisJICogPHByZT4KKwkgKiBDdXJ2ZVByaXZhdGVLZXkgOjo9IE9DVEVUIFNUUklORworCSAqIDwvcHJlPgorCSAqCisJICogQHBhcmFtIGVuY29kZWQKKwkgKiAgICAgICAgICAgIGVuY29kZWQgcHJpdmF0ZSBrZXkgdG8gZXh0cmFjdCB0aGUgcHJpdmF0ZSBrZXkgYnl0ZXMgZnJvbQorCSAqIEBwYXJhbSBuCisJICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgZXhwZWN0ZWQKKwkgKiBAcmV0dXJuIHRoZSBleHRyYWN0ZWQgcHJpdmF0ZSBrZXkgYnl0ZXM7IG9mIGxlbmd0aCB7QGNvZGUgbn0KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIHByaXZhdGUga2V5IGNhbm5vdCBiZSBleHRyYWN0ZWQKKwkgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1OTU4Ij5SRkMgNTk1ODwvYT4KKwkgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM4NDEwIj5SRkMgODQxMDwvYT4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBieXRlW10gYXNuMVBhcnNlKGJ5dGVbXSBlbmNvZGVkLCBpbnQgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJYnl0ZVtdIHByaXZhdGVLZXkgPSBudWxsOworCQl0cnkgKERFUlBhcnNlciBieXRlUGFyc2VyID0gbmV3IERFUlBhcnNlcihlbmNvZGVkKTsKKwkJCQlERVJQYXJzZXIgb25lQXN5bW1ldHJpY0tleSA9IGJ5dGVQYXJzZXIucmVhZE9iamVjdCgpCisJCQkJCQkuY3JlYXRlUGFyc2VyKCkpIHsKKwkJCW9uZUFzeW1tZXRyaWNLZXkucmVhZE9iamVjdCgpOyAvLyBza2lwIHZlcnNpb24KKwkJCW9uZUFzeW1tZXRyaWNLZXkucmVhZE9iamVjdCgpOyAvLyBza2lwIGFsZ29yaXRobSBpZGVudGlmaWVyCisJCQlwcml2YXRlS2V5ID0gb25lQXN5bW1ldHJpY0tleS5yZWFkT2JqZWN0KCkuZ2V0VmFsdWUoKTsKKwkJCS8vIFRoZSBsYXN0IG4gYnl0ZXMgb2YgdGhpcyBtdXN0IGJlIHRoZSBwcml2YXRlIGtleSBieXRlcworCQkJcmV0dXJuIEFycmF5cy5jb3B5T2ZSYW5nZShwcml2YXRlS2V5LAorCQkJCQlwcml2YXRlS2V5Lmxlbmd0aCAtIG4sIHByaXZhdGVLZXkubGVuZ3RoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChwcml2YXRlS2V5ICE9IG51bGwpIHsKKwkJCQlBcnJheXMuZmlsbChwcml2YXRlS2V5LCAoYnl0ZSkgMCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBBIHNhZmUgdmVyc2lvbiBvZiB7QGxpbmsgQnVmZmVyI2dldFB1YmxpY0tleSgpfS4gVXBvbiByZXR1cm4gdGhlCisJICogYnVmZmVycydzIHJlYWQgcG9zaXRpb24gaXMgYWx3YXlzIGFmdGVyIHRoZSBrZXkgYmxvYjsgYW55IGV4Y2VwdGlvbnMKKwkgKiB0aHJvd24gYnkgdHJ5aW5nIHRvIHJlYWQgdGhlIGtleSBhcmUgbG9nZ2VkIGFuZCA8ZW0+bm90PC9lbT4gcHJvcGFnYXRlZC4KKwkgKiA8cD4KKwkgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGFuIFNTSCBhZ2VudCBtaWdodCBjb250YWluIGFuZCBkZWxpdmVyIGtleXMgdGhhdAorCSAqIHdlIGNhbm5vdCBoYW5kbGUgKGZvciBpbnN0YW5jZSBlZDQ0OCBrZXlzKS4KKwkgKiA8L3A+CisJICoKKwkgKiBAcGFyYW0gYnVmZmVyCisJICogICAgICAgICAgICB0byByZWFkIHRoZSBrZXkgZnJvbQorCSAqIEByZXR1cm4gdGhlIHtAbGluayBQdWJsaWNLZXl9LCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGtleSBjb3VsZCBub3QgYmUKKwkgKiAgICAgICAgIHJlYWQKKwkgKiBAdGhyb3dzIEJ1ZmZlckV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBsZW5ndGggb2YgdGhlIGtleSBibG9iIGNhbm5vdCBiZSByZWFkIG9yIGlzIGNvcnJ1cHRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIFB1YmxpY0tleSByZWFkS2V5KEJ1ZmZlciBidWZmZXIpIHRocm93cyBCdWZmZXJFeGNlcHRpb24geworCQlpbnQgZW5kT2ZCdWZmZXIgPSBidWZmZXIud3BvcygpOworCQlpbnQga2V5TGVuZ3RoID0gYnVmZmVyLmdldEludCgpOworCQlpbnQgYWZ0ZXJLZXkgPSBidWZmZXIucnBvcygpICsga2V5TGVuZ3RoOworCQlpZiAoa2V5TGVuZ3RoIDw9IDAgfHwgYWZ0ZXJLZXkgPiBlbmRPZkJ1ZmZlcikgeworCQkJdGhyb3cgbmV3IEJ1ZmZlckV4Y2VwdGlvbigKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoU3NoZFRleHQuZ2V0KCkuc3NoQWdlbnRXcm9uZ0tleUxlbmd0aCwKKwkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGtleUxlbmd0aCksCisJCQkJCQkJSW50ZWdlci50b1N0cmluZyhidWZmZXIucnBvcygpKSwKKwkJCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGVuZE9mQnVmZmVyKSkpOworCQl9CisJCS8vIExpbWl0IHN1YnNlcXVlbnQgcmVhZHMgdG8gdGhlIHB1YmxpYyBrZXkgYmxvYgorCQlidWZmZXIud3BvcyhhZnRlcktleSk7CisJCXRyeSB7CisJCQlyZXR1cm4gYnVmZmVyLmdldFJhd1B1YmxpY0tleShCdWZmZXJQdWJsaWNLZXlQYXJzZXIuREVGQVVMVCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlMT0cud2FybihTc2hkVGV4dC5nZXQoKS5zc2hBZ2VudFVua25vd25LZXksIGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0gZmluYWxseSB7CisJCQkvLyBSZXN0b3JlIHJlYWwgYnVmZmVyIGVuZAorCQkJYnVmZmVyLndwb3MoZW5kT2ZCdWZmZXIpOworCQkJLy8gU2V0IHRoZSByZWFkIHBvc2l0aW9uIHRvIGFmdGVyIHRoaXMga2V5LCBldmVuIGlmIGZhaWxlZAorCQkJYnVmZmVyLnJwb3MoYWZ0ZXJLZXkpOworCQl9CisJfQorCiAJcHJpdmF0ZSBCdWZmZXIgcnBjKGJ5dGUgY29tbWFuZCwgYnl0ZVtdIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBuZXcgQnl0ZUFycmF5QnVmZmVyKGNvbm5lY3Rvci5ycGMoY29tbWFuZCwgbWVzc2FnZSkpOwogCX0KQEAgLTIzMCwxMSArNDY0LDYgQEAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgewogCX0KIAogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZElkZW50aXR5KEtleVBhaXIga2V5LCBTdHJpbmcgY29tbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcmVtb3ZlSWRlbnRpdHkoUHVibGljS2V5IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9zc2hkL1NzaGRTZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvU3NoZFNlc3Npb24uamF2YQppbmRleCBjMjcwYjQ0Li5iNzQyZjVlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvU3NoZFNlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3NzaGQvU3NoZFNlc3Npb24uamF2YQpAQCAtNTEsNiArNTEsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5zZnRwLmNvbW1vbi5TZnRwRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoLk9wZW5Tc2hDb25maWdGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaGQuSkdpdFNzaENsaWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2hkLlNzaGRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkZ0cENoYW5uZWw7CkBAIC0xMzgsNyArMTM5LDExIEBAIHByaXZhdGUgQ2xpZW50U2Vzc2lvbiBjb25uZWN0KFVSSWlzaCB0YXJnZXQsIExpc3Q8VVJJaXNoPiBqdW1wcywKIAkJCQkJCUpHaXRTc2hDbGllbnQuTE9DQUxfRk9SV0FSRF9BRERSRVNTLAogCQkJCQkJcG9ydEZvcndhcmQuZ2V0Qm91bmRBZGRyZXNzKCkpOwogCQkJfQotCQkJcmVzdWx0U2Vzc2lvbiA9IGNvbm5lY3QoaG9zdENvbmZpZywgY29udGV4dCwgdGltZW91dCk7CisJCQlpbnQgdGltZW91dEluU2VjID0gT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoCisJCQkJCWhvc3RDb25maWcuZ2V0UHJvcGVydHkoU3NoQ29uc3RhbnRzLkNPTk5FQ1RfVElNRU9VVCkpOworCQkJcmVzdWx0U2Vzc2lvbiA9IGNvbm5lY3QoaG9zdENvbmZpZywgY29udGV4dCwKKwkJCQkJdGltZW91dEluU2VjID4gMCA/IER1cmF0aW9uLm9mU2Vjb25kcyh0aW1lb3V0SW5TZWMpCisJCQkJCQkJOiB0aW1lb3V0KTsKIAkJCWlmIChwcm94eVNlc3Npb24gIT0gbnVsbCkgewogCQkJCWZpbmFsIFBvcnRGb3J3YXJkaW5nVHJhY2tlciB0cmFja2VyID0gcG9ydEZvcndhcmQ7CiAJCQkJZmluYWwgQ2xpZW50U2Vzc2lvbiBwU2Vzc2lvbiA9IHByb3h5U2Vzc2lvbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAzOGUyZTg1Li40YTA4OTQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDE5ICszLDE4IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNi4wLjEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCiBJbXBvcnQtUGFja2FnZTogY29tLmpjcmFmdC5qc2NoO3ZlcnNpb249IlswLjEuNTQsMC4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjAsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaC5qc2NoO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuc3NoO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaC5qc2NoO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKICBvcmcuaGFtY3Jlc3Q7dmVyc2lvbj0iWzEuMS4wLDMuMC4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEzLDUuMC4wKSIsCiAgb3JnLmp1bml0LmV4cGVyaW1lbnRhbC50aGVvcmllczt2ZXJzaW9uPSJbNC4xMyw1LjAuMCkiLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvcG9tLnhtbAppbmRleCA2ZjE5OWU2Li5jYTFlNzQyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGVkOTk3ZmIuLjMzMmQ5ODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywxOSArMywxOSBAQAogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoO3NpbmdsZXRvbjo9dHJ1ZQotRnJhZ21lbnQtSG9zdDogb3JnLmVjbGlwc2UuamdpdDtidW5kbGUtdmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIKK0ZyYWdtZW50LUhvc3Q6IG9yZy5lY2xpcHNlLmpnaXQ7YnVuZGxlLXZlcnNpb249Ils2LjEuMSw2LjIuMCkiCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDYuMS4xLnF1YWxpZmllcgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaC5qc2NoO3ZlcnNpb249IjYuMC4xIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnNzaC5qc2NoO3ZlcnNpb249IjYuMS4xIgogSW1wb3J0LVBhY2thZ2U6IGNvbS5qY3JhZnQuanNjaDt2ZXJzaW9uPSJbMC4xLjM3LDAuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2g7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCAzYzNmMmIxLi5iNTZiYjdjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgpAQCAtMyw1ICszLDUgQEAKIEJ1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoIC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDYuMC4xLnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2g7dmVyc2lvbj0iNi4wLjEucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoO3ZlcnNpb249IjYuMS4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoL3BvbS54bWwKaW5kZXggMmE1ZjliOC4uM2I2ZDY2YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gvcG9tLnhtbApAQCAtMTcsNyArMTcsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Ni4xLjEtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2g8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvQlVJTEQgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvQlVJTEQKaW5kZXggOWU3ODdmZS4uZTYzYzAyYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L0JVSUxECisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9CVUlMRApAQCAtMTMsNiArMTMsNyBAQAogKSArIFtQS0cgKyBjIGZvciBjIGluIFsKICAgICAiYXBpL0Fic3RyYWN0UmVtb3RlQ29tbWFuZFRlc3QuamF2YSIsCiAgICAgImRpZmYvQWJzdHJhY3REaWZmVGVzdENhc2UuamF2YSIsCisgICAgImludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxUb29sVGVzdENhc2UuamF2YSIsCiAgICAgImludGVybmFsL3JldndhbGsvT2JqZWN0UmVhY2hhYmlsaXR5VGVzdENhc2UuamF2YSIsCiAgICAgImludGVybmFsL3JldndhbGsvUmVhY2hhYmlsaXR5Q2hlY2tlclRlc3RDYXNlLmphdmEiLAogICAgICJpbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR2NUZXN0Q2FzZS5qYXZhIiwKQEAgLTUwLDYgKzUxLDIzIEBACiAgICAgZXhjbHVkZSA9IEhFTFBFUlMgKyBEQVRBICsgRVhDTFVERUQsCiApKQogCisjIE5vbiBhYnN0cmFjdCBiYXNlIGNsYXNzZXMgdXNlZCBmb3IgdGVzdHMgYnkgb3RoZXIgdGVzdCBjbGFzc2VzCitCQVNFID0gWworICAgIFBLRyArICJpbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlcG9zaXRvcnlCdWlsZGVyVGVzdC5qYXZhIiwKKyAgICBQS0cgKyAiaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVRlc3QuamF2YSIsCitdCisKK2phdmFfbGlicmFyeSgKKyAgICBuYW1lID0gImJhc2UiLAorICAgIHRlc3Rvbmx5ID0gMSwKKyAgICBzcmNzID0gQkFTRSwKKyAgICBkZXBzID0gWworICAgICAgICAiLy9saWI6anVuaXQiLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0OmpnaXQiLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Omp1bml0IiwKKyAgICBdLAorKQorCiBqYXZhX2xpYnJhcnkoCiAgICAgbmFtZSA9ICJoZWxwZXJzIiwKICAgICB0ZXN0b25seSA9IDEsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMDQ2OTExMy4uNTgxMzk1ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMTEKQEAgLTE2LDYwICsxNiw2MSBAQAogIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5jb21wcmVzc29ycy5nemlwO3ZlcnNpb249IlsxLjE1LjAsMi4wKSIsCiAgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmNvbXByZXNzb3JzLnh6O3ZlcnNpb249IlsxLjE1LjAsMi4wKSIsCiAgb3JnLmFzc2VydGouY29yZS5hcGk7dmVyc2lvbj0iWzMuMTQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmJsYW1lO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZS5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LmNvbm5lY3Rpdml0eTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnBhcnNlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2g7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnRpbWU7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sb2dnaW5nO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50czt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuY29ubmVjdGl2aXR5O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQucGFyc2VyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnNzaDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQudGltZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxvZ2dpbmc7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAogIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuaGFtY3Jlc3QuY29sbGVjdGlvbjt2ZXJzaW9uPSJbMS4xLjAsMy4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTMsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3BvbS54bWwKaW5kZXggM2NhYjM2Mi4uNmI2NjkxOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3BvbS54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdGVzdHMuYnpsIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3Rlc3RzLmJ6bAppbmRleCBlMjAxYmRiLi4xNzBiZjBjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdGVzdHMuYnpsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90ZXN0cy5iemwKQEAgLTUyLDYgKzUyLDEyIEBACiAgICAgICAgICAgICAgICAgIi8vbGliOnh6IiwKICAgICAgICAgICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU6amdpdC1hcmNoaXZlIiwKICAgICAgICAgICAgIF0KKyAgICAgICAgaWYgc3JjLmVuZHN3aXRoKCJGaWxlUmVwb3NpdG9yeUJ1aWxkZXJBZnRlck9wZW5Db25maWdUZXN0LmphdmEiKSBvciBcCisgICAgICAgICAgIHNyYy5lbmRzd2l0aCgiUmVmRGlyZWN0b3J5QWZ0ZXJPcGVuQ29uZmlnVGVzdC5qYXZhIikgb3IgXAorICAgICAgICAgICBzcmMuZW5kc3dpdGgoIlNuYXBzaG90dGluZ1JlZkRpcmVjdG9yeVRlc3QuamF2YSIpOgorICAgICAgICAgICAgYWRkaXRpb25hbF9kZXBzID0gWworICAgICAgICAgICAgICAgICI6YmFzZSIsCisgICAgICAgICAgICBdCiAgICAgICAgIGhlYXBfc2l6ZSA9ICItWG14MjU2bSIKICAgICAgICAgaWYgc3JjLmVuZHN3aXRoKCJIdWdlQ29tbWl0TWVzc2FnZVRlc3QuamF2YSIpOgogICAgICAgICAgICAgaGVhcF9zaXplID0gIi1YbXg1MTJtIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcHBseUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YQppbmRleCA4NjczMTBiLi41ODRkMTQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5JTzsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtNDAyLDcgKzQwMyw5IEBAIHB1YmxpYyB2b2lkIHRlc3RNb2RpZnlXKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdEFkZE0xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUFwcGx5UmVzdWx0IHJlc3VsdCA9IGluaXQoIk0xIiwgZmFsc2UsIHRydWUpOwogCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKS5jYW5FeGVjdXRlKCkpOworCQlpZiAoRlMuREVURUNURUQuc3VwcG9ydHNFeGVjdXRlKCkpIHsKKwkJCWFzc2VydFRydWUoRlMuREVURUNURUQuY2FuRXhlY3V0ZShyZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuZ2V0KDApKSk7CisJCX0KIAkJY2hlY2tGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJNMSIpLAogCQkJCWIuZ2V0U3RyaW5nKDAsIGIuc2l6ZSgpLCBmYWxzZSkpOwogCX0KQEAgLTQxMSw3ICs0MTQsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0QWRkTTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJQXBwbHlSZXN1bHQgcmVzdWx0ID0gaW5pdCgiTTIiLCB0cnVlLCB0cnVlKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5nZXQoMCkuY2FuRXhlY3V0ZSgpKTsKKwkJaWYgKEZTLkRFVEVDVEVELnN1cHBvcnRzRXhlY3V0ZSgpKSB7CisJCQlhc3NlcnRUcnVlKEZTLkRFVEVDVEVELmNhbkV4ZWN1dGUocmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLmdldCgwKSkpOworCQl9CiAJCWNoZWNrRmlsZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiTTIiKSwKIAkJCQliLmdldFN0cmluZygwLCBiLnNpemUoKSwgZmFsc2UpKTsKIAl9CkBAIC00MjAsNyArNDI1LDEwIEBAIHB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNMigpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNMygpIHRocm93cyBFeGNlcHRpb24gewogCQlBcHBseVJlc3VsdCByZXN1bHQgPSBpbml0KCJNMyIsIHRydWUsIHRydWUpOwogCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldFVwZGF0ZWRGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc3VsdC5nZXRVcGRhdGVkRmlsZXMoKS5nZXQoMCkuY2FuRXhlY3V0ZSgpKTsKKwkJaWYgKEZTLkRFVEVDVEVELnN1cHBvcnRzRXhlY3V0ZSgpKSB7CisJCQlhc3NlcnRGYWxzZSgKKwkJCQkJRlMuREVURUNURUQuY2FuRXhlY3V0ZShyZXN1bHQuZ2V0VXBkYXRlZEZpbGVzKCkuZ2V0KDApKSk7CisJCX0KIAkJY2hlY2tGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJNMyIpLAogCQkJCWIuZ2V0U3RyaW5nKDAsIGIuc2l6ZSgpLCBmYWxzZSkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQnJhbmNoQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQnJhbmNoQ29tbWFuZFRlc3QuamF2YQppbmRleCBlN2VkMTAyLi44N2JlODEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CcmFuY2hDb21tYW5kVGVzdC5qYXZhCkBAIC03MSw2ICs3MSw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIEdpdCBzZXRVcFJlcG9XaXRoUmVtb3RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVJlcG9zaXRvcnkgcmVtb3RlUmVwb3NpdG9yeSA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKHJlbW90ZVJlcG9zaXRvcnkpOwogCQl0cnkgKEdpdCByZW1vdGVHaXQgPSBuZXcgR2l0KHJlbW90ZVJlcG9zaXRvcnkpKSB7CiAJCQkvLyBjb21taXQgc29tZXRoaW5nCiAJCQl3cml0ZVRyYXNoRmlsZSgiVGVzdC50eHQiLCAiSGVsbG8gd29ybGQiKTsKQEAgLTg1LDYgKzg2LDcgQEAgcHJpdmF0ZSBHaXQgc2V0VXBSZXBvV2l0aFJlbW90ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJcnVwLmZvcmNlVXBkYXRlKCk7CiAKIAkJCVJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5ID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKKwkJCWFkZFJlcG9Ub0Nsb3NlKGxvY2FsUmVwb3NpdG9yeSk7CiAJCQlHaXQgbG9jYWxHaXQgPSBuZXcgR2l0KGxvY2FsUmVwb3NpdG9yeSk7CiAJCQlTdG9yZWRDb25maWcgY29uZmlnID0gbG9jYWxSZXBvc2l0b3J5LmdldENvbmZpZygpOwogCQkJUmVtb3RlQ29uZmlnIHJjID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJvcmlnaW4iKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlY2tvdXRDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVja291dENvbW1hbmRUZXN0LmphdmEKaW5kZXggZTUyMDczMi4uYWIwMTg0YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVja291dENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVja291dENvbW1hbmRUZXN0LmphdmEKQEAgLTI5Miw2ICsyOTIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRBbm5vdGF0ZWRUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RDaGVja291dFJlbW90ZVRyYWNraW5nV2l0aFVwc3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVJlcG9zaXRvcnkgZGIyID0gY3JlYXRlUmVwb3NpdG9yeVdpdGhSZW1vdGUoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoZGIyKTsKIAogCQlHaXQud3JhcChkYjIpLmNoZWNrb3V0KCkuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLnNldE5hbWUoInRlc3QiKQogCQkJCS5zZXRTdGFydFBvaW50KCJvcmlnaW4vdGVzdCIpCkBAIC0zMTEsNiArMzEyLDcgQEAgcHVibGljIHZvaWQgdGVzdENoZWNrb3V0UmVtb3RlVHJhY2tpbmdXaXRoVXBzdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RDaGVja291dFJlbW90ZVRyYWNraW5nV2l0aG91dExvY2FsQnJhbmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVJlcG9zaXRvcnkgZGIyID0gY3JlYXRlUmVwb3NpdG9yeVdpdGhSZW1vdGUoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoZGIyKTsKIAogCQkvLyBjaGVja291dCByZW1vdGUgdHJhY2tpbmcgYnJhbmNoIGluIHNlY29uZCByZXBvc2l0b3J5CiAJCS8vIChubyBsb2NhbCBicmFuY2hlcyBleGlzdCB5ZXQgaW4gc2Vjb25kIHJlcG9zaXRvcnkpCkBAIC04NjgsNyArODcwLDcgQEAgcHVibGljIHZvaWQgdGVzdE5vbkRlbGV0YWJsZUZpbGVzT25XaW5kb3dzKCkKIAkJCWNvQ29tbWFuZC5zZXROYW1lKGNydWRDb21taXQuZ2V0TmFtZSgpKS5jYWxsKCk7CiAJCQlDaGVja291dFJlc3VsdCByZXN1bHQgPSBjb0NvbW1hbmQuZ2V0UmVzdWx0KCk7CiAJCQlhc3NlcnRFcXVhbHMoU3RhdHVzLk5PTkRFTEVURUQsIHJlc3VsdC5nZXRTdGF0dXMoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIltUZXN0LnR4dCwgdG9CZURlbGV0ZWQudHh0XSIsCisJCQlhc3NlcnRFcXVhbHMoIlt0b0JlRGVsZXRlZC50eHRdIiwKIAkJCQkJcmVzdWx0LmdldFJlbW92ZWRMaXN0KCkudG9TdHJpbmcoKSk7CiAJCQlhc3NlcnRFcXVhbHMoIlt0b0JlQ3JlYXRlZC50eHQsIHRvQmVNb2RpZmllZC50eHRdIiwKIAkJCQkJcmVzdWx0LmdldE1vZGlmaWVkTGlzdCgpLnRvU3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmRUZXN0LmphdmEKaW5kZXggZjRmMGVjZC4uMGQzODE5NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhCkBAIC0xNzUsNyArMTc1LDggQEAgcHVibGljIHZvaWQgdGVzdENoZXJyeVBpY2tDb25mbGljdFJlc29sdXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQkJYXNzZXJ0RXF1YWxzKENoZXJyeVBpY2tTdGF0dXMuQ09ORkxJQ1RJTkcsIHJlc3VsdC5nZXRTdGF0dXMoKSk7CiAJCQlhc3NlcnRUcnVlKG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuTUVSR0VfTVNHKS5leGlzdHMoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoInNpZGVcblxuQ29uZmxpY3RzOlxuXHRhXG4iLCBkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CisJCQlhc3NlcnRFcXVhbHMoInNpZGVcblxuIyBDb25mbGljdHM6XG4jXHRhXG4iLAorCQkJCQlkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CiAJCQlhc3NlcnRUcnVlKG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuQ0hFUlJZX1BJQ0tfSEVBRCkKIAkJCQkJLmV4aXN0cygpKTsKIAkJCWFzc2VydEVxdWFscyhzaWRlQ29tbWl0LmdldElkKCksIGRiLnJlYWRDaGVycnlQaWNrSGVhZCgpKTsKQEAgLTIwNyw3ICsyMDgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlcnJ5UGlja0NvbmZsaWN0UmVzb2x1dGlvbk5vQ29tbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVN0cmluZyBleHBlY3RlZCA9ICI8PDw8PDw8IG1hc3RlclxuYShtYXN0ZXIpXG49PT09PT09XG5hKHNpZGUpXG4+Pj4+Pj4+IDUyNzQ2MGEgc2lkZVxuIjsKIAkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZWFkKCJhIikpOwogCQlhc3NlcnRUcnVlKG5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuTUVSR0VfTVNHKS5leGlzdHMoKSk7Ci0JCWFzc2VydEVxdWFscygic2lkZVxuXG5Db25mbGljdHM6XG5cdGFcbiIsIGRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKKwkJYXNzZXJ0RXF1YWxzKCJzaWRlXG5cbiMgQ29uZmxpY3RzOlxuI1x0YVxuIiwgZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOwogCQlhc3NlcnRGYWxzZShuZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgQ29uc3RhbnRzLkNIRVJSWV9QSUNLX0hFQUQpCiAJCQkJLmV4aXN0cygpKTsKIAkJYXNzZXJ0RXF1YWxzKFJlcG9zaXRvcnlTdGF0ZS5TQUZFLCBkYi5nZXRSZXBvc2l0b3J5U3RhdGUoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmRUZXN0LmphdmEKaW5kZXggODA4NDUwNS4uMzVkZTczZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YQpAQCAtNDYsNiArNDYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZmxvZ0VudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU3RvcmVkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdENvbmZpZy5DbGVhbnVwTW9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZS5TdWJtb2R1bGVXYWxrOwpAQCAtNTE1LDYgKzUxNiw2MiBAQCBwdWJsaWMgdm9pZCBjb21taXRBbWVuZFdpdGhBdXRob3JTaG91bGRVc2VJdCgpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgY29tbWl0TWVzc2FnZVZlcmJhdGltKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQl3cml0ZVRyYXNoRmlsZSgiZmlsZTEiLCAiZmlsZTEiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZTEiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0dGVkID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIiNpbml0aWFsIGNvbW1pdCIpCisJCQkJCS5jYWxsKCk7CisKKwkJCWFzc2VydEVxdWFscygiI2luaXRpYWwgY29tbWl0IiwgY29tbWl0dGVkLmdldEZ1bGxNZXNzYWdlKCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb21taXRNZXNzYWdlU3RyaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCXdyaXRlVHJhc2hGaWxlKCJmaWxlMSIsICJmaWxlMSIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmaWxlMSIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXR0ZWQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgKKwkJCQkJIiNDb21tZW50XG5pbml0aWFsIGNvbW1pdFx0XG5cbiBjb21taXQgYm9keSBcbiBcdCNhbm90aGVyIGNvbW1lbnQiKQorCQkJCQkuc2V0Q2xlYW51cE1vZGUoQ2xlYW51cE1vZGUuU1RSSVApLmNhbGwoKTsKKworCQkJYXNzZXJ0RXF1YWxzKCJpbml0aWFsIGNvbW1pdFxuXG4gY29tbWl0IGJvZHkiLAorCQkJCQljb21taXR0ZWQuZ2V0RnVsbE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbW1pdE1lc3NhZ2VEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQl3cml0ZVRyYXNoRmlsZSgiZmlsZTEiLCAiZmlsZTEiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZTEiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0dGVkID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoCisJCQkJCSIjQ29tbWVudFxuaW5pdGlhbCBjb21taXRcdFxuXG4gY29tbWl0IGJvZHkgXG5cblxuIFx0I2Fub3RoZXIgY29tbWVudCAgIikKKwkJCQkJLnNldENsZWFudXBNb2RlKENsZWFudXBNb2RlLkRFRkFVTFQpLmNhbGwoKTsKKworCQkJYXNzZXJ0RXF1YWxzKCJpbml0aWFsIGNvbW1pdFxuXG4gY29tbWl0IGJvZHkiLAorCQkJCQljb21taXR0ZWQuZ2V0RnVsbE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGNvbW1pdE1lc3NhZ2VEZWZhdWx0V2hpdGVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJd3JpdGVUcmFzaEZpbGUoImZpbGUxIiwgImZpbGUxIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZpbGUxIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdHRlZCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKAorCQkJCQkiI0NvbW1lbnRcbmluaXRpYWwgY29tbWl0XHRcblxuIGNvbW1pdCBib2R5IFxuXG5cbiBcdCNhbm90aGVyIGNvbW1lbnQgICIpCisJCQkJCS5zZXRDbGVhbnVwTW9kZShDbGVhbnVwTW9kZS5ERUZBVUxUKS5zZXREZWZhdWx0Q2xlYW4oZmFsc2UpCisJCQkJCS5jYWxsKCk7CisKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIiNDb21tZW50XG5pbml0aWFsIGNvbW1pdFxuXG4gY29tbWl0IGJvZHlcblxuIFx0I2Fub3RoZXIgY29tbWVudCIsCisJCQkJCWNvbW1pdHRlZC5nZXRGdWxsTWVzc2FnZSgpKTsKKwkJfQorCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgY29tbWl0RW1wdHlDb21taXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggYjQ2MGUzZi4uYWI4N2ZhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEKQEAgLTEwLDkgKzEwLDEwIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CkBAIC0xMDAsNiArMTAxLDEyIEBAIHB1YmxpYyB2b2lkIHRlc3REZXNjcmliZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0yLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJhbGljZSoiKSk7CiAJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJib2IqIikpOwogCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYSoiLCAiYioiLCAiYyoiKSk7CisKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCAwKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2IiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCAxKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2IiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCAtMTApKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzU1OTI3OTA1ZjIxZTNiYzdjMDBhM2Q4M2EzMWJmNGVkM2EiLAorCQkJCQlkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIDUwKSk7CiAJCX0gZWxzZSB7CiAJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzIpKTsKIAkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjMykpOwpAQCAtMTA4LDYgKzExNSwxOCBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWFzc2VydEVxdWFscygiMzc0N2RiMyIsIGRlc2NyaWJlKGMyLCBmYWxzZSwgdHJ1ZSkpOwogCQkJYXNzZXJ0RXF1YWxzKCI0NDU3OWViIiwgZGVzY3JpYmUoYzMsIGZhbHNlLCB0cnVlKSk7CiAJCQlhc3NlcnRFcXVhbHMoIjNlNTYzYzUiLCBkZXNjcmliZShjNCwgZmFsc2UsIHRydWUpKTsKKworCQkJYXNzZXJ0RXF1YWxzKCIzNzQ3ZGIzMjY3IiwgZGVzY3JpYmUoYzIsIGZhbHNlLCB0cnVlLCAxMCkpOworCQkJYXNzZXJ0RXF1YWxzKCI0NDU3OWViZTdmIiwgZGVzY3JpYmUoYzMsIGZhbHNlLCB0cnVlLCAxMCkpOworCQkJYXNzZXJ0RXF1YWxzKCIzZTU2M2M1NTkyIiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCAxMCkpOworCisJCQlhc3NlcnRFcXVhbHMoIjNlNTYiLCBkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIC0xMCkpOworCQkJYXNzZXJ0RXF1YWxzKCIzZTU2IiwgZGVzY3JpYmUoYzQsIGZhbHNlLCB0cnVlLCAwKSk7CisJCQlhc3NlcnRFcXVhbHMoIjNlNTYiLCBkZXNjcmliZShjNCwgZmFsc2UsIHRydWUsIDIpKTsKKwkJCWFzc2VydEVxdWFscygiM2U1NjNjNTU5Mjc5MDVmMjFlM2JjN2MwMGEzZDgzYTMxYmY0ZWQzYSIsCisJCQkJCWRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSwgNDApKTsKKwkJCWFzc2VydEVxdWFscygiM2U1NjNjNTU5Mjc5MDVmMjFlM2JjN2MwMGEzZDgzYTMxYmY0ZWQzYSIsCisJCQkJCWRlc2NyaWJlKGM0LCBmYWxzZSwgdHJ1ZSwgNDIpKTsKIAkJfQogCiAJCS8vIHRlc3QgZGVmYXVsdCB0YXJnZXQKQEAgLTQ3NCwxMCArNDkzLDE1IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgdG91Y2goRmlsZSBmLCBTdHJpbmcgY29udGVudHMpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAJfQogCisJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgYzEsIGJvb2xlYW4gbG9uZ0Rlc2MsIGJvb2xlYW4gYWx3YXlzLAorCQkJaW50IGFiYnJldikgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlyZXR1cm4gZ2l0LmRlc2NyaWJlKCkuc2V0VGFyZ2V0KGMxKS5zZXRUYWdzKGRlc2NyaWJlVXNlQWxsVGFncykKKwkJCQkuc2V0TG9uZyhsb25nRGVzYykuc2V0QWx3YXlzKGFsd2F5cykuc2V0QWJicmV2KGFiYnJldikuY2FsbCgpOworCX0KKwogCXByaXZhdGUgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIGMxLCBib29sZWFuIGxvbmdEZXNjLCBib29sZWFuIGFsd2F5cykKIAkJCXRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdpdC5kZXNjcmliZSgpLnNldFRhcmdldChjMSkuc2V0VGFncyhkZXNjcmliZVVzZUFsbFRhZ3MpCi0JCQkJLnNldExvbmcobG9uZ0Rlc2MpLnNldEFsd2F5cyhhbHdheXMpLmNhbGwoKTsKKwkJcmV0dXJuIGRlc2NyaWJlKGMxLCBsb25nRGVzYywgYWx3YXlzLCBPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpOwogCX0KIAogCXByaXZhdGUgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIGMxKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0VvbFJlcG9zaXRvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0VvbFJlcG9zaXRvcnlUZXN0LmphdmEKaW5kZXggZDBkZmQxYS4uYjkzN2IxZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xSZXBvc2l0b3J5VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRW9sUmVwb3NpdG9yeVRlc3QuamF2YQpAQCAtMSw0MCArMSwxMSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSwgSXZhbiBNb3RzY2ggPGl2YW4ubW90c2NoQGJzaWFnLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxNSwgMjAyMiBJdmFuIE1vdHNjaCA8aXZhbi5tb3RzY2hAYnNpYWcuY29tPiBhbmQgb3RoZXJzCiAgKgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCiAgKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi0gKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLSAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCi0gKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAotICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIApAQCAtMTczLDE1ICsxNDQsMjIgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWN0dWFsRW50cnkgewogCiAJcHJpdmF0ZSBEaXJDYWNoZSBkaXJDYWNoZTsKIAorCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRDckxmKCkgeworCQlTdHJpbmcgZW9sID0gbW9ja1N5c3RlbVJlYWRlci5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKwkJcmV0dXJuICJcclxuIi5lcXVhbHMoZW9sKTsKKwl9CisKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gZm9yIEVPTCB0byB3b3JrLCB0aGUgdGV4dCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQKIAkJc2V0dXBHaXRBbmREb0hhcmRSZXNldChudWxsLCBudWxsLCBudWxsLCBudWxsLCAiKiB0ZXh0PWF1dG8iKTsKIAkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoInRleHQ9YXV0byIsIGVudHJ5Q1JMRi5hdHRycyk7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeU1peGVkLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKKwkJLy8gZW9sPW5hdGl2ZSBpcyB0aGUgZGVmYXVsdCEKKwkJU3RyaW5nIGV4cGVjdGVkID0gaXNEZWZhdWx0Q3JMZigpID8gQ09OVEVOVF9DUkxGIDogQ09OVEVOVF9MRjsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TEYsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlNaXhlZCwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOwogCX0KIAogCXB1YmxpYyB2b2lkIGNoZWNrRW50cnlDb250ZW50KEFjdHVhbEVudHJ5IGVudHJ5LCBTdHJpbmcgZmlsZUNvbnRlbnQsCkBAIC0xOTksOSArMTc3LDExIEBAIHB1YmxpYyB2b2lkIHRlc3RfQ29uZmlnQXV0b0NSTEZfZmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc2V0dXBHaXRBbmREb0hhcmRSZXNldChBdXRvQ1JMRi5GQUxTRSwgbnVsbCwgbnVsbCwgbnVsbCwgIiogdGV4dD1hdXRvIik7CiAJCWNvbGxlY3RSZXBvc2l0b3J5U3RhdGUoKTsKIAkJYXNzZXJ0RXF1YWxzKCJ0ZXh0PWF1dG8iLCBlbnRyeUNSTEYuYXR0cnMpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlNaXhlZCwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7CisJCS8vIGVvbD1uYXRpdmUgaXMgdGhlIGRlZmF1bHQhCisJCVN0cmluZyBleHBlY3RlZCA9IGlzRGVmYXVsdENyTGYoKSA/IENPTlRFTlRfQ1JMRiA6IENPTlRFTlRfTEY7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TWl4ZWQsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKIAl9CiAKIAlAVGVzdApAQCAtMjUwLDM0ICsyMzAsMjQgQEAgcHVibGljIHZvaWQgdGVzdF9Db25maWdFT0xfY3JsZigpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0X0NvbmZpZ0VPTF9uYXRpdmVfd2luZG93cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgb3JpZ0xpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXHJcbiIpOwotCQl0cnkgewotCQkJLy8gZm9yIEVPTCB0byB3b3JrLCB0aGUgdGV4dCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQKLQkJCXNldHVwR2l0QW5kRG9IYXJkUmVzZXQobnVsbCwgRU9MLk5BVElWRSwgIioudHh0IHRleHQiLCBudWxsLCBudWxsKTsKLQkJCWNvbGxlY3RSZXBvc2l0b3J5U3RhdGUoKTsKLQkJCWFzc2VydEVxdWFscygidGV4dCIsIGVudHJ5Q1JMRi5hdHRycyk7Ci0JCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCX0gZmluYWxseSB7Ci0JCQlTeXN0ZW0uc2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgb3JpZ0xpbmVTZXBhcmF0b3IpOwotCQl9CisJCW1vY2tTeXN0ZW1SZWFkZXIuc2V0V2luZG93cygpOworCQkvLyBmb3IgRU9MIHRvIHdvcmssIHRoZSB0ZXh0IGF0dHJpYnV0ZSBtdXN0IGJlIHNldAorCQlzZXR1cEdpdEFuZERvSGFyZFJlc2V0KG51bGwsIEVPTC5OQVRJVkUsICIqLnR4dCB0ZXh0IiwgbnVsbCwgbnVsbCk7CisJCWNvbGxlY3RSZXBvc2l0b3J5U3RhdGUoKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgZW50cnlDUkxGLmF0dHJzKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlDUkxGLCBDT05URU5UX0NSTEYsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0NSTEYsIENPTlRFTlRfTEYpOwogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdF9Db25maWdFT0xfbmF0aXZlX3huaXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG9yaWdMaW5lU2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7Ci0JCXRyeSB7Ci0JCQkvLyBmb3IgRU9MIHRvIHdvcmssIHRoZSB0ZXh0IGF0dHJpYnV0ZSBtdXN0IGJlIHNldAotCQkJc2V0dXBHaXRBbmREb0hhcmRSZXNldChudWxsLCBFT0wuTkFUSVZFLCAiKi50eHQgdGV4dCIsIG51bGwsIG51bGwpOwotCQkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOwotCQkJYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgZW50cnlDUkxGLmF0dHJzKTsKLQkJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7Ci0JCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJfSBmaW5hbGx5IHsKLQkJCVN5c3RlbS5zZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCBvcmlnTGluZVNlcGFyYXRvcik7Ci0JCX0KKwkJbW9ja1N5c3RlbVJlYWRlci5zZXRVbml4KCk7CisJCS8vIGZvciBFT0wgdG8gd29yaywgdGhlIHRleHQgYXR0cmlidXRlIG11c3QgYmUgc2V0CisJCXNldHVwR2l0QW5kRG9IYXJkUmVzZXQobnVsbCwgRU9MLk5BVElWRSwgIioudHh0IHRleHQiLCBudWxsLCBudWxsKTsKKwkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOworCQlhc3NlcnRFcXVhbHMoInRleHQiLCBlbnRyeUNSTEYuYXR0cnMpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKIAl9CiAKIAlAVGVzdApAQCAtMjk3LDkgKzI2NywxMCBAQCBwdWJsaWMgdm9pZCB0ZXN0X0NvbmZpZ0F1dG9DUkxGX2ZhbHNlX0NvbmZpZ0VPTF9uYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc2V0dXBHaXRBbmREb0hhcmRSZXNldChBdXRvQ1JMRi5GQUxTRSwgRU9MLk5BVElWRSwgIioudHh0IHRleHQiLCBudWxsLCBudWxsKTsKIAkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoInRleHQiLCBlbnRyeUNSTEYuYXR0cnMpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlNaXhlZCwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7CisJCVN0cmluZyBleHBlY3RlZCA9IGlzRGVmYXVsdENyTGYoKSA/IENPTlRFTlRfQ1JMRiA6IENPTlRFTlRfTEY7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5Q1JMRiwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CisJCWNoZWNrRW50cnlDb250ZW50KGVudHJ5TWl4ZWQsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKIAl9CiAKIAlAVGVzdApAQCAtNTI0LDkgKzQ5NSwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0X0dsb2JhbEVPTF9sZl9JbmZvRU9MX3Vuc3BlY19Sb290RU9MX2NybGYoKQogCQkvLyBpbmZvIG92ZXJyaWRlcyBhbGwKIAkJY29sbGVjdFJlcG9zaXRvcnlTdGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoInRleHQiLCBlbnRyeUNSTEYuYXR0cnMpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIENPTlRFTlRfTEYsIENPTlRFTlRfTEYpOwotCQljaGVja0VudHJ5Q29udGVudChlbnRyeUxGLCBDT05URU5UX0xGLCBDT05URU5UX0xGKTsKLQkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlNaXhlZCwgQ09OVEVOVF9MRiwgQ09OVEVOVF9MRik7CisJCS8vICFlb2wgbWVhbnMgdW5zcGVjaWZpZWQsIHNvIHVzZSB0aGUgZGVmYXVsdCBvZiBjb3JlLmVvbCwgd2hpY2ggaXMKKwkJLy8gbmF0aXZlLgorCQlTdHJpbmcgZXhwZWN0ZWQgPSBpc0RlZmF1bHRDckxmKCkgPyBDT05URU5UX0NSTEYgOiBDT05URU5UX0xGOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeUNSTEYsIGV4cGVjdGVkLCBDT05URU5UX0xGKTsKKwkJY2hlY2tFbnRyeUNvbnRlbnQoZW50cnlMRiwgZXhwZWN0ZWQsIENPTlRFTlRfTEYpOworCQljaGVja0VudHJ5Q29udGVudChlbnRyeU1peGVkLCBleHBlY3RlZCwgQ09OVEVOVF9MRik7CiAJfQogCiAJQFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hBbmRQdWxsQ29tbWFuZHNSZWN1cnNlU3VibW9kdWxlc1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hBbmRQdWxsQ29tbWFuZHNSZWN1cnNlU3VibW9kdWxlc1Rlc3QuamF2YQppbmRleCAzNmJhN2NlLi45ZWE2NGVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQW5kUHVsbENvbW1hbmRzUmVjdXJzZVN1Ym1vZHVsZXNUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaEFuZFB1bGxDb21tYW5kc1JlY3Vyc2VTdWJtb2R1bGVzVGVzdC5qYXZhCkBAIC0yNTksNyArMjU5LDggQEAgcHJpdmF0ZSBSZXZDb21taXQgdXBkYXRlU3VibW9kdWxlUmV2aXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gdGhlIGNvbW1pdCB0aGF0IHdhcyBjcmVhdGVkCiAJCXRyeSAoU3VibW9kdWxlV2FsayB3ID0gU3VibW9kdWxlV2Fsay5mb3JJbmRleChnaXQuZ2V0UmVwb3NpdG9yeSgpKSkgewogCQkJYXNzZXJ0VHJ1ZSh3Lm5leHQoKSk7Ci0JCQl0cnkgKEdpdCBnID0gbmV3IEdpdCh3LmdldFJlcG9zaXRvcnkoKSkpIHsKKwkJCXRyeSAoUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gdy5nZXRSZXBvc2l0b3J5KCk7CisJCQkJCUdpdCBnID0gbmV3IEdpdChyZXBvc2l0b3J5KSkgewogCQkJCWcuZmV0Y2goKS5zZXRSZW1vdGUoUkVNT1RFKS5zZXRSZWZTcGVjcyhSRUZTUEVDKS5jYWxsKCk7CiAJCQkJZy5yZXNldCgpLnNldE1vZGUoUmVzZXRUeXBlLkhBUkQpLnNldFJlZihjb21taXQxLm5hbWUoKSkuY2FsbCgpOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQppbmRleCBiYzRlOTQwLi42NDQ3NWY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQpAQCAtNTU0LDcgKzU1NCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RNZXJnZU1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWdpdC5tZXJnZSgpLmluY2x1ZGUoc2lkZUJyYW5jaCkKIAkJCQkJLnNldFN0cmF0ZWd5KE1lcmdlU3RyYXRlZ3kuUkVTT0xWRSkuY2FsbCgpOwogCi0JCQlhc3NlcnRFcXVhbHMoIk1lcmdlIGJyYW5jaCAnc2lkZSdcblxuQ29uZmxpY3RzOlxuXHRhXG4iLAorCQkJYXNzZXJ0RXF1YWxzKCJNZXJnZSBicmFuY2ggJ3NpZGUnXG5cbiMgQ29uZmxpY3RzOlxuI1x0YVxuIiwKIAkJCQkJZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOwogCQl9CiAKQEAgLTE3ODcsNyArMTc4Nyw3IEBAIHB1YmxpYyB2b2lkIHRlc3RTcXVhc2hNZXJnZUNvbmZsaWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJCQkJKyBkYXRlRm9ybWF0dGVyLmZvcm1hdERhdGUodGhpcmQKIAkJCQkJCQkJCS5nZXRBdXRob3JJZGVudCgpKSArICJcblxuXHR0aGlyZCBjb21taXRcbiIsCiAJCQkJCWRiLnJlYWRTcXVhc2hDb21taXRNc2coKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIlxuQ29uZmxpY3RzOlxuXHRmaWxlMlxuIiwgZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJcbiMgQ29uZmxpY3RzOlxuI1x0ZmlsZTJcbiIsIGRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKIAogCQkJU3RhdHVzIHN0YXQgPSBnaXQuc3RhdHVzKCkuY2FsbCgpOwogCQkJYXNzZXJ0RXF1YWxzKFNldHMub2YoImZpbGUyIiksIHN0YXQuZ2V0Q29uZmxpY3RpbmcoKSk7CkBAIC0xODgxLDYgKzE4ODEsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RmFzdEZvcndhcmRPbmx5Tm90UG9zc2libGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVNZXJnZVdpdGhDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGRiX3QgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCUJyYW5jaEJ1aWxkZXIgbWFzdGVyID0gZGJfdC5icmFuY2goIm1hc3RlciIpOwogCQkJUmV2Q29tbWl0IG0wID0gbWFzdGVyLmNvbW1pdCgpCiAJCQkJCS5hZGQoImYiLCAiMVxuMlxuM1xuNFxuNVxuNlxuN1xuOFxuOVxuIikubWVzc2FnZSgibTAiKQpAQCAtMjAxMiw3ICsyMDEzLDcgQEAgcHVibGljIHZvaWQgdGVzdE1lcmdlQ29uZmxpY3RXaXRoTWVzc2FnZU9wdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogCQkJZ2l0Lm1lcmdlKCkuaW5jbHVkZShzaWRlQnJhbmNoKS5zZXRTdHJhdGVneShNZXJnZVN0cmF0ZWd5LlJFU09MVkUpCiAJCQkJCS5zZXRNZXNzYWdlKCJ1c2VyIG1lc3NhZ2UiKS5jYWxsKCk7CiAKLQkJCWFzc2VydEVxdWFscygidXNlciBtZXNzYWdlXG5cbkNvbmZsaWN0czpcblx0YVxuIiwKKwkJCWFzc2VydEVxdWFscygidXNlciBtZXNzYWdlXG5cbiMgQ29uZmxpY3RzOlxuI1x0YVxuIiwKIAkJCQkJZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRUZXN0LmphdmEKaW5kZXggOWFmNzdhYS4uNmE4NGYwYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhCkBAIC01NjcsNiArNTY3LDcgQEAgcHJpdmF0ZSB2b2lkIGRvVGVzdFB1bGxXaXRoUmViYXNlKENhbGxhYmxlPFB1bGxSZXN1bHQ+IHB1bGxTZXR1cCwKIAlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlzdXBlci5zZXRVcCgpOwogCQlkYlRhcmdldCA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKGRiVGFyZ2V0KTsKIAkJc291cmNlID0gbmV3IEdpdChkYik7CiAJCXRhcmdldCA9IG5ldyBHaXQoZGJUYXJnZXQpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kV2l0aFJlYmFzZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRXaXRoUmViYXNlVGVzdC5qYXZhCmluZGV4IGNjZTA0ZjQuLmUyZDc5MjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRXaXRoUmViYXNlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRXaXRoUmViYXNlVGVzdC5qYXZhCkBAIC0zMjMsNiArMzIzLDcgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZGJUYXJnZXQgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOwogCQlzb3VyY2UgPSBuZXcgR2l0KGRiKTsKIAkJdGFyZ2V0ID0gbmV3IEdpdChkYlRhcmdldCk7CisJCWFkZFJlcG9Ub0Nsb3NlKGRiVGFyZ2V0KTsKIAogCQkvLyBwdXQgc29tZSBmaWxlIGluIHRoZSBzb3VyY2UgcmVwbwogCQlzb3VyY2VGaWxlID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgIlNvbWVGaWxlLnR4dCIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmRUZXN0LmphdmEKaW5kZXggYTc4NjA2NS4uNmY3YWE2MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kVGVzdC5qYXZhCkBAIC0xMCw3ICsxMCw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtMTksMTAgKzIxLDEzIEBACiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkRldGFjaGVkSGVhZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5JbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSkdpdEludGVybmFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob1JlbW90ZVJlcG9zaXRvcnlFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ob29rcy5QcmVQdXNoSG9vazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkpHaXRUZXN0VXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKQEAgLTMyLDYgKzM3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hDb25maWcuUHVzaERlZmF1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUHVzaFJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZMZWFzZVNwZWM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmU3BlYzsKQEAgLTUwLDYgKzU2LDcgQEAgcHVibGljIHZvaWQgdGVzdFB1c2goKSB0aHJvd3MgSkdpdEludGVybmFsRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKIAogCQkvLyBjcmVhdGUgb3RoZXIgcmVwb3NpdG9yeQogCQlSZXBvc2l0b3J5IGRiMiA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKGRiMik7CiAJCWZpbmFsIFN0b3JlZENvbmZpZyBjb25maWcyID0gZGIyLmdldENvbmZpZygpOwogCiAJCS8vIHRoaXMgdGVzdHMgdGhhdCB0aGlzIGNvbmZpZyBjYW4gYmUgcGFyc2VkIHByb3Blcmx5CkBAIC0yODksNiArMjk2LDc3MCBAQCBwdWJsaWMgdm9pZCB0ZXN0UHVzaFdpdGhvdXRQdXNoUmVmU3BlYygpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaGluZyBmcm9tIGEgZGV0YWNoZWQgSEVBRCB3aXRob3V0IHJlZnNwZWMgdGhyb3dzIGEKKwkgKiBEZXRhY2hlZEhlYWRFeGNlcHRpb24uCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0RGV0YWNoZWRIZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJZmluYWwgU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZShjb21taXQuZ2V0TmFtZSgpKS5jYWxsKCk7CisJCQlTdHJpbmcgaGVhZCA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0RnVsbEJyYW5jaCgpOworCQkJYXNzZXJ0VHJ1ZShPYmplY3RJZC5pc0lkKGhlYWQpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0TmFtZSgpLCBoZWFkKTsKKwkJCWFzc2VydFRocm93cyhEZXRhY2hlZEhlYWRFeGNlcHRpb24uY2xhc3MsCisJCQkJCSgpIC0+IGdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikuY2FsbCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaC5kZWZhdWx0PW5vdGhpbmcgd2l0aG91dCByZWZzcGVjIHRocm93cyBhbgorCSAqIEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdE5vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlmaW5hbCBTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydFRocm93cyhJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJKCkgLT4gZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCQkJCS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5OT1RISU5HKS5jYWxsKCkpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9bWF0Y2hpbmcgd2l0aG91dCByZWZzcGVjIHB1c2hlcyBhbGwgbWF0Y2hpbmcKKwkgKiBicmFuY2hlcy4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHRNYXRjaGluZygpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCWZpbmFsIFN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCS8vIHB1c2ggbWFzdGVyIGFuZCBicmFuY2h0b3B1c2gKKwkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0Iikuc2V0UmVmU3BlY3MoCisJCQkJCW5ldyBSZWZTcGVjKCJyZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL21hc3RlciIpLAorCQkJCQluZXcgUmVmU3BlYygKKwkJCQkJCQkicmVmcy9oZWFkcy9icmFuY2h0b3B1c2g6cmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSkKKwkJCQkJLmNhbGwoKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCS8vIENyZWF0ZSB0d28gZGlmZmVyZW50IGNvbW1pdHMgb24gdGhlc2UgdHdvIGJyYW5jaGVzCisJCQl3cml0ZVRyYXNoRmlsZSgiYiIsICJvbiBicmFuY2h0b3B1c2giKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBiQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIm9uIGJyYW5jaHRvcHVzaCIpCisJCQkJCS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7CisJCQl3cml0ZVRyYXNoRmlsZSgibSIsICJvbiBtYXN0ZXIiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigibSIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBtQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIm9uIG1hc3RlciIpLmNhbGwoKTsKKwkJCS8vIE5vdyBwdXNoIHdpdGggbW9kZSAibWF0Y2hpbmciOiBzaG91bGQgcHVzaCBib3RoIGJyYW5jaGVzLgorCQkJSXRlcmFibGU8UHVzaFJlc3VsdD4gcmVzdWx0ID0gZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuTUFUQ0hJTkcpCisJCQkJCS5jYWxsKCk7CisJCQlpbnQgbiA9IDA7CisJCQlmb3IgKFB1c2hSZXN1bHQgciA6IHJlc3VsdCkgeworCQkJCW4rKzsKKwkJCQlhc3NlcnRFcXVhbHMoMSwgbik7CisJCQkJYXNzZXJ0RXF1YWxzKDIsIHIuZ2V0UmVtb3RlVXBkYXRlcygpLnNpemUoKSk7CisJCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdXBkYXRlIDogci5nZXRSZW1vdGVVcGRhdGVzKCkpIHsKKwkJCQkJYXNzZXJ0RmFsc2UodXBkYXRlLmlzTWF0Y2hpbmcoKSk7CisJCQkJCWFzc2VydFRydWUodXBkYXRlLmdldFNyY1JlZigpCisJCQkJCQkJLmVxdWFscygicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKQorCQkJCQkJCXx8IHVwZGF0ZS5nZXRTcmNSZWYoKS5lcXVhbHMoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJCQlhc3NlcnRFcXVhbHMoUmVtb3RlUmVmVXBkYXRlLlN0YXR1cy5PSywgdXBkYXRlLmdldFN0YXR1cygpKTsKKwkJCQl9CisJCQl9CisJCQlhc3NlcnRFcXVhbHMoYkNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobUNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydEVxdWFscyhiQ29tbWl0LmdldElkKCksIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhtQ29tbWl0LmdldElkKCksCisJCQkJCWdpdC5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2guZGVmYXVsdD11cHN0cmVhbSB3aXRob3V0IHJlZnNwZWMgcHVzaGVzIG9ubHkgdGhlIGN1cnJlbnQKKwkgKiBicmFuY2ggdG8gdGhlIGNvbmZpZ3VyZWQgdXBzdHJlYW0uCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0VXBzdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL3Vwc3RyZWFtYnJhbmNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0Iikuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuVVBTVFJFQU0pCisJCQkJCS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLCBnaXQuZ2V0UmVwb3NpdG9yeSgpCisJCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL3Vwc3RyZWFtYnJhbmNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vYnJhbmNodG9wdXNoIikpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9dXBzdHJlYW0gd2l0aG91dCByZWZzcGVjIHRocm93cyBhbgorCSAqIEludmFsaWRSZWZOYW1lRXhjZXB0aW9uIGlmIHRoZSBjdXJyZW50IGJyYW5jaCBoYXMgbm8gdXBzdHJlYW0uCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0VXBzdHJlYW1Ob1RyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRUaHJvd3MoSW52YWxpZFJlZk5hbWVFeGNlcHRpb24uY2xhc3MsCisJCQkJCSgpIC0+IGdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuVVBTVFJFQU0pLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2guZGVmYXVsdD11cHN0cmVhbSB3aXRob3V0IHJlZnNwZWMgdGhyb3dzIGFuCisJICogSW52YWxpZFJlZk5hbWVFeGNlcHRpb24gaWYgdGhlIHB1c2ggcmVtb3RlIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgZmV0Y2gKKwkgKiByZW1vdGUuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0VXBzdHJlYW1Ucmlhbmd1bGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQkvLyBEb24ndCBjb25maWd1cmUgYSByZW1vdGU7IGl0J2xsIGRlZmF1bHQgdG8gIm9yaWdpbiIuCisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInVwc3RyZWFtYnJhbmNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRUaHJvd3MoSW52YWxpZFJlZk5hbWVFeGNlcHRpb24uY2xhc3MsCisJCQkJCSgpIC0+IGdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuVVBTVFJFQU0pLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHB1c2guZGVmYXVsdD1zaW1wbGUgd2l0aG91dCByZWZzcGVjIHB1c2hlcyBvbmx5IHRoZSBjdXJyZW50CisJICogYnJhbmNoIHRvIHRoZSBjb25maWd1cmVkIHVwc3RyZWFtIG5hbWUuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0U2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJyZW1vdGUiLCAidGVzdCIpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJtZXJnZSIsCisJCQkJCSJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0Iikuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuU0lNUExFKQorCQkJCQkuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vYnJhbmNodG9wdXNoIikpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9c2ltcGxlIHdpdGhvdXQgcmVmc3BlYyBwdXNoZXMgb25seSB0aGUgY3VycmVudAorCSAqIGJyYW5jaCB0byBhIGJyYW5jaCB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gYSB0cmlhbmd1bGFyIHdvcmtmbG93LgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdFNpbXBsZVRyaWFuZ3VsYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQkvLyBEb24ndCBzZXQgcmVtb3RlLCBpdCdsbCBkZWZhdWx0IHRvICJvcmlnaW4iLiBDb25maWd1cmUgYQorCQkJLy8gZGlmZmVyZW50IGJyYW5jaCBuYW1lOyBzaG91bGQgYmUgaWdub3JlZC4KKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5TSU1QTEUpCisJCQkJCS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLCBnaXQuZ2V0UmVwb3NpdG9yeSgpCisJCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL2JyYW5jaHRvcHVzaCIpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIHRoYXQgcHVzaC5kZWZhdWx0PXNpbXBsZSB3aXRob3V0IHJlZnNwZWMgdGhyb3dzIGFuCisJICogSW52YWxpZFJlZk5hbWVFeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGhhcyBubyB1cHN0cmVhbS4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UHVzaERlZmF1bHRTaW1wbGVOb1RyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRUaHJvd3MoSW52YWxpZFJlZk5hbWVFeGNlcHRpb24uY2xhc3MsCisJCQkJCSgpIC0+IGdpdC5wdXNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuU0lNUExFKS5jYWxsKCkpOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2sgdGhhdCBwdXNoLmRlZmF1bHQ9c2ltcGxlIHdpdGhvdXQgcmVmc3BlYyB0aHJvd3MgYW4KKwkgKiBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbiBpZiB0aGUgY3VycmVudCBicmFuY2ggaGFzIGFuIHVwc3RyZWFtIHdpdGggYQorCSAqIGRpZmZlcmVudCBuYW1lLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdFNpbXBsZURpZmZlcmVudFRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydFRocm93cyhJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJKCkgLT4gZ2l0LnB1c2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCQkJCS5zZXRQdXNoRGVmYXVsdChQdXNoRGVmYXVsdC5TSU1QTEUpLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IGlmIG5vIFB1c2hEZWZhdWx0IGlzIHNldCwgdGhlIHZhbHVlIGlzIHJlYWQgZnJvbSB0aGUgZ2l0CisJICogY29uZmlnLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RQdXNoRGVmYXVsdEZyb21Db25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNldFN0cmluZygicHVzaCIsIG51bGwsICJkZWZhdWx0IiwgInVwc3RyZWFtIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQl3cml0ZVRyYXNoRmlsZSgiZiIsICJjb250ZW50IG9mIGYiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJUHVzaENvbW1hbmQgY21kID0gZ2l0LnB1c2goKTsKKwkJCWNtZC5zZXRSZW1vdGUoInRlc3QiKS5zZXRQdXNoRGVmYXVsdChudWxsKS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuVVBTVFJFQU0sIGNtZC5nZXRQdXNoRGVmYXVsdCgpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL2JyYW5jaHRvcHVzaCIpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy91cHN0cmVhbWJyYW5jaCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL25vdC1wdXNoZWQiKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksIGdpdC5nZXRSZXBvc2l0b3J5KCkKKwkJCQkJLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vdXBzdHJlYW1icmFuY2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9icmFuY2h0b3B1c2giKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IGlmIG5vIFB1c2hEZWZhdWx0IGlzIHNldCBhbmQgbm9uZSBpcyBzZXQgaW4gdGhlIGdpdCBjb25maWcsIGl0CisJICogZGVmYXVsdHMgdG8gInNpbXBsZSIuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFB1c2hEZWZhdWx0RnJvbUNvbmZpZ0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgInJlbW90ZSIsICJ0ZXN0Iik7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkucmVzb2x2ZSgicmVmcy9oZWFkcy9ub3QtcHVzaGVkIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbWFzdGVyIikpOworCQkJUHVzaENvbW1hbmQgY21kID0gZ2l0LnB1c2goKTsKKwkJCWNtZC5zZXRSZW1vdGUoInRlc3QiKS5zZXRQdXNoRGVmYXVsdChudWxsKS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuU0lNUExFLCBjbWQuZ2V0UHVzaERlZmF1bHQoKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9icmFuY2h0b3B1c2giKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IGJyYW5jaC48bmFtZT4ucHVzaFJlbW90ZSBvdmVycmlkZXMgYW55dGhpbmcgZWxzZS4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QnJhbmNoUHVzaFJlbW90ZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKKwkJCQlHaXQgZ2l0MiA9IG5ldyBHaXQoY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkpIHsKKwkJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJUmVtb3RlQ29uZmlnIHJlbW90ZUNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcoY29uZmlnLCAidGVzdCIpOworCQkJVVJJaXNoIHVyaSA9IG5ldyBVUklpc2goCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9VUkwoKSk7CisJCQlyZW1vdGVDb25maWcuYWRkVVJJKHVyaSk7CisJCQlyZW1vdGVDb25maWcuYWRkRmV0Y2hSZWZTcGVjKAorCQkJCQluZXcgUmVmU3BlYygiK3JlZnMvaGVhZHMvKjpyZWZzL3JlbW90ZXMvb3JpZ2luLyoiKSk7CisJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CisJCQljb25maWcuc2V0U3RyaW5nKCJyZW1vdGUiLCBudWxsLCAicHVzaERlZmF1bHQiLCAidGVzdCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicHVzaHJlbW90ZSIsICJvcmlnaW4iKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydFRocm93cyhJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gZ2l0LnB1c2goKQorCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuVVBTVFJFQU0pLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHJlbW90ZS5wdXNoRGVmYXVsdCBvdmVycmlkZXMgYnJhbmNoLjxuYW1lPi5yZW1vdGUKKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3RlUHVzaERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CisJCQkJR2l0IGdpdDIgPSBuZXcgR2l0KGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpKSB7CisJCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCVJlbW90ZUNvbmZpZyByZW1vdGVDb25maWcgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywgInRlc3QiKTsKKwkJCVVSSWlzaCB1cmkgPSBuZXcgVVJJaXNoKAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvVVJMKCkpOworCQkJcmVtb3RlQ29uZmlnLmFkZFVSSSh1cmkpOworCQkJcmVtb3RlQ29uZmlnLmFkZEZldGNoUmVmU3BlYygKKwkJCQkJbmV3IFJlZlNwZWMoIityZWZzL2hlYWRzLyo6cmVmcy9yZW1vdGVzL29yaWdpbi8qIikpOworCQkJcmVtb3RlQ29uZmlnLnVwZGF0ZShjb25maWcpOworCQkJY29uZmlnLnNldFN0cmluZygicmVtb3RlIiwgbnVsbCwgInB1c2hEZWZhdWx0IiwgIm9yaWdpbiIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJd3JpdGVUcmFzaEZpbGUoImYiLCAiY29udGVudCBvZiBmIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImYiKS5jYWxsKCk7CisJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIGYiKS5jYWxsKCk7CisKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm5vdC1wdXNoZWQiKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgiYnJhbmNodG9wdXNoIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKworCQkJY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAicmVtb3RlIiwgInRlc3QiKTsKKwkJCWNvbmZpZy5zZXRTdHJpbmcoImJyYW5jaCIsICJicmFuY2h0b3B1c2giLCAibWVyZ2UiLAorCQkJCQkicmVmcy9oZWFkcy9icmFuY2h0b3B1c2giKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCWFzc2VydFRocm93cyhJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gZ2l0LnB1c2goKQorCQkJCQkuc2V0UHVzaERlZmF1bHQoUHVzaERlZmF1bHQuVVBTVFJFQU0pLmNhbGwoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IHVsdGltYXRlbHkgd2UgZmFsbCBiYWNrIHRvICJvcmlnaW4iLgorCSAqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UmVtb3RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmIikuY2FsbCgpOworCisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJub3QtcHVzaGVkIikuc2V0Q3JlYXRlQnJhbmNoKHRydWUpLmNhbGwoKTsKKwkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoImJyYW5jaHRvcHVzaCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisKKwkJCWNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQljb25maWcuc2V0U3RyaW5nKCJicmFuY2giLCAiYnJhbmNodG9wdXNoIiwgIm1lcmdlIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIik7CisJCQljb25maWcuc2F2ZSgpOworCisJCQlQdXNoQ29tbWFuZCBjbWQgPSBnaXQucHVzaCgpLnNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0LlVQU1RSRUFNKTsKKwkJCVRyYW5zcG9ydEV4Y2VwdGlvbiBlID0gYXNzZXJ0VGhyb3dzKFRyYW5zcG9ydEV4Y2VwdGlvbi5jbGFzcywKKwkJCQkJKCkgLT4gY21kLmNhbGwoKSk7CisJCQlhc3NlcnRFcXVhbHMoTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmNsYXNzLAorCQkJCQllLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisJCQlhc3NlcnRFcXVhbHMoIm9yaWdpbiIsIGNtZC5nZXRSZW1vdGUoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0aGF0IGEgcHVzaCB3aXRob3V0IHNwZWNpZnlpbmcgYSByZW1vdGUgb3IgbW9kZSBvciBhbnl0aGluZyBjYW4KKwkgKiBzdWNjZWVkIGlmIHRoZSBnaXQgY29uZmlnIGlzIGNvcnJlY3QuCisJICoKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdERlZmF1bHRQdXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOworCQkJCUdpdCBnaXQyID0gbmV3IEdpdChjcmVhdGVCYXJlUmVwb3NpdG9yeSgpKSkgeworCQkJU3RvcmVkQ29uZmlnIGNvbmZpZyA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCk7CisJCQlSZW1vdGVDb25maWcgcmVtb3RlQ29uZmlnID0gbmV3IFJlbW90ZUNvbmZpZyhjb25maWcsICJ0ZXN0Iik7CisJCQlVUklpc2ggdXJpID0gbmV3IFVSSWlzaCgKKwkJCQkJZ2l0Mi5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1VSTCgpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRVUkkodXJpKTsKKwkJCXJlbW90ZUNvbmZpZy5hZGRGZXRjaFJlZlNwZWMoCisJCQkJCW5ldyBSZWZTcGVjKCIrcmVmcy9oZWFkcy8qOnJlZnMvcmVtb3Rlcy9vcmlnaW4vKiIpKTsKKwkJCXJlbW90ZUNvbmZpZy51cGRhdGUoY29uZmlnKTsKKwkJCWNvbmZpZy5zYXZlKCk7CisKKwkJCXdyaXRlVHJhc2hGaWxlKCJmIiwgImNvbnRlbnQgb2YgZiIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGRpbmcgZiIpLmNhbGwoKTsKKworCQkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibm90LXB1c2hlZCIpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5jYWxsKCk7CisJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJicmFuY2h0b3B1c2giKS5zZXRDcmVhdGVCcmFuY2godHJ1ZSkuY2FsbCgpOworCisJCQljb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQkJY29uZmlnLnNldFN0cmluZygiYnJhbmNoIiwgImJyYW5jaHRvcHVzaCIsICJyZW1vdGUiLCAidGVzdCIpOworCQkJY29uZmlnLnNhdmUoKTsKKworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCS8vIFNob3VsZCB1c2UgcmVtb3RlICJ0ZXN0IiwgcHVzaC5kZWZhdWx0PWN1cnJlbnQKKwkJCVB1c2hDb21tYW5kIGNtZCA9IGdpdC5wdXNoKCk7CisJCQljbWQuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgY21kLmdldFJlbW90ZSgpKTsKKwkJCWFzc2VydEVxdWFscyhQdXNoRGVmYXVsdC5DVVJSRU5ULCBjbWQuZ2V0UHVzaERlZmF1bHQoKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvYnJhbmNodG9wdXNoIikpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsCisJCQkJCWdpdDIuZ2V0UmVwb3NpdG9yeSgpLnJlc29sdmUoInJlZnMvaGVhZHMvbm90LXB1c2hlZCIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLAorCQkJCQlnaXQyLmdldFJlcG9zaXRvcnkoKS5yZXNvbHZlKCJyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwgZ2l0LmdldFJlcG9zaXRvcnkoKQorCQkJCQkucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9icmFuY2h0b3B1c2giKSk7CisJCX0KKwl9CisKKwkvKioKIAkgKiBDaGVjayB0aGF0IG1pc3NpbmcgcmVmcyBkb24ndCBjYXVzZSBlcnJvcnMgZHVyaW5nIHB1c2gKIAkgKgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCkBAIC0yOTcsNiArMTA2OCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQdXNoV2l0aG91dFB1c2hSZWZTcGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdFB1c2hBZnRlckdDKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIGNyZWF0ZSBvdGhlciByZXBvc2l0b3J5CiAJCVJlcG9zaXRvcnkgZGIyID0gY3JlYXRlV29ya1JlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoZGIyKTsKIAogCQkvLyBzZXR1cCB0aGUgZmlyc3QgcmVwb3NpdG9yeQogCQlmaW5hbCBTdG9yZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CkBAIC0zNjAsNiArMTEzMiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQdXNoV2l0aExlYXNlKCkgdGhyb3dzIEpHaXRJbnRlcm5hbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCiAKIAkJLy8gY3JlYXRlIG90aGVyIHJlcG9zaXRvcnkKIAkJUmVwb3NpdG9yeSBkYjIgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShkYjIpOwogCiAJCS8vIHNldHVwIHRoZSBmaXJzdCByZXBvc2l0b3J5CiAJCWZpbmFsIFN0b3JlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YQppbmRleCA4NjIzOTAyLi5jNjRmZjBiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kVGVzdC5qYXZhCkBAIC0yOTI3LDggKzI5MjcsOCBAQCBwdWJsaWMgU3RyaW5nIG1vZGlmeUNvbW1pdE1lc3NhZ2UoU3RyaW5nIGNvbW1pdCkgewogCQl9CiAJfQogCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmViYXNlSW50ZXJhY3RpdmVGaXh1cFdpdGhCbGFua0xpbmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHNpbXBsZUZpeHVwKFN0cmluZyBmaXJzdE1lc3NhZ2UsIFN0cmluZyBzZWNvbmRNZXNzYWdlKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIGNyZWF0ZSBmaWxlMSBvbiBtYXN0ZXIKIAkJd3JpdGVUcmFzaEZpbGUoRklMRTEsIEZJTEUxKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKEZJTEUxKS5jYWxsKCk7CkBAIC0yOTM4LDEzICsyOTM4LDEzIEBAIHB1YmxpYyB2b2lkIHRlc3RSZWJhc2VJbnRlcmFjdGl2ZUZpeHVwV2l0aEJsYW5rTGluZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gY3JlYXRlIGZpbGUyIG9uIG1hc3RlcgogCQl3cml0ZVRyYXNoRmlsZSgiZmlsZTIiLCAiZmlsZTIiKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmaWxlMiIpLmNhbGwoKTsKLQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkFkZCBmaWxlMiIpLmNhbGwoKTsKKwkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoZmlyc3RNZXNzYWdlKS5jYWxsKCk7CiAJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImZpbGUyIikuZXhpc3RzKCkpOwogCiAJCS8vIHVwZGF0ZSBGSUxFMSBvbiBtYXN0ZXIKIAkJd3JpdGVUcmFzaEZpbGUoRklMRTEsICJibGFoIik7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihGSUxFMSkuY2FsbCgpOwotCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgidXBkYXRlZCBmaWxlMSBvbiBtYXN0ZXJcblxuc29tZSB0ZXh0IikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShzZWNvbmRNZXNzYWdlKS5jYWxsKCk7CiAKIAkJZ2l0LnJlYmFzZSgpLnNldFVwc3RyZWFtKCJIRUFEfjIiKQogCQkJCS5ydW5JbnRlcmFjdGl2ZWx5KG5ldyBJbnRlcmFjdGl2ZUhhbmRsZXIoKSB7CkBAIC0yOTY4LDkgKzI5NjgsMzEgQEAgcHVibGljIFN0cmluZyBtb2RpZnlDb21taXRNZXNzYWdlKFN0cmluZyBjb21taXQpIHsKIAkJdHJ5IChSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhkYikpIHsKIAkJCU9iamVjdElkIGhlYWRJZCA9IGRiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOwogCQkJUmV2Q29tbWl0IGhlYWRDb21taXQgPSB3YWxrLnBhcnNlQ29tbWl0KGhlYWRJZCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkFkZCBmaWxlMiIsCi0JCQkJCWhlYWRDb21taXQuZ2V0RnVsbE1lc3NhZ2UoKSk7CisJCQlhc3NlcnRFcXVhbHMoZmlyc3RNZXNzYWdlLCBoZWFkQ29tbWl0LmdldEZ1bGxNZXNzYWdlKCkpOwogCQl9CisKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWJhc2VJbnRlcmFjdGl2ZUZpeHVwV2l0aEJsYW5rTGluZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2ltcGxlRml4dXAoIkFkZCBmaWxlMiIsICJ1cGRhdGVkIGZpbGUxIG9uIG1hc3RlclxuXG5zb21lIHRleHQiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZWJhc2VJbnRlcmFjdGl2ZUZpeHVwV2l0aEJsYW5rTGluZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNpbXBsZUZpeHVwKCJBZGQgZmlsZTJcblxuQm9keVxuIiwKKwkJCQkidXBkYXRlZCBmaWxlMSBvbiBtYXN0ZXJcblxuc29tZSB0ZXh0Iik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmViYXNlSW50ZXJhY3RpdmVGaXh1cFdpdGhIYXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXNpbXBsZUZpeHVwKCIjQWRkIGZpbGUyIiwgInVwZGF0ZWQgZmlsZTEgb24gbWFzdGVyIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmViYXNlSW50ZXJhY3RpdmVGaXh1cFdpdGhIYXNoMigpIHRocm93cyBFeGNlcHRpb24geworCQlzaW1wbGVGaXh1cCgiI0FkZCBmaWxlMlxuXG5IZWFkZXIgaGFzIGhhc2hcbiIsCisJCQkJIiN1cGRhdGVkIGZpbGUxIG9uIG1hc3RlciIpOwogCX0KIAogCUBUZXN0KGV4cGVjdGVkID0gSW52YWxpZFJlYmFzZVN0ZXBFeGNlcHRpb24uY2xhc3MpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEKaW5kZXggY2ZhODQ4Ni4uMWM3YjhkMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZFRlc3QuamF2YQpAQCAtOSw2ICs5LDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMTY2LDcgKzE2Nyw5IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnRNdWx0aXBsZVdpdGhGYWlsKCkgdGhyb3dzIElPRXhjZXB0aW9uLAogCiAJCQljaGVja0ZpbGUobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImEiKSwgImZpcnN0XG4iCiAJCQkJCSsgIjw8PDw8PDwgbWFzdGVyXG4iICsgInNlY29uZFxuIiArICJ0aGlyZFxuIiArICI9PT09PT09XG4iCi0JCQkJCSsgIj4+Pj4+Pj4gIiArIHNlY29uZENvbW1pdC5nZXRJZCgpLmFiYnJldmlhdGUoNykubmFtZSgpCisJCQkJCSsgIj4+Pj4+Pj4gIgorCQkJCQkrIHNlY29uZENvbW1pdC5nZXRJZCgpCisJCQkJCQkJLmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKS5uYW1lKCkKIAkJCQkJKyAiIGFkZCBzZWNvbmRcbiIpOwogCQkJSXRlcmF0b3I8UmV2Q29tbWl0PiBoaXN0b3J5ID0gZ2l0LmxvZygpLmNhbGwoKS5pdGVyYXRvcigpOwogCQkJUmV2Q29tbWl0IHJldmVydENvbW1pdCA9IGhpc3RvcnkubmV4dCgpOwpAQCAtMjMyLDcgKzIzNSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnRDb25mbGljdFJlc29sdXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5NRVJHRV9NU0cpLmV4aXN0cygpKTsKIAkJCWFzc2VydEVxdWFscygiUmV2ZXJ0IFwiIiArIHNpZGVDb21taXQuZ2V0U2hvcnRNZXNzYWdlKCkKIAkJCQkJKyAiXCJcblxuVGhpcyByZXZlcnRzIGNvbW1pdCAiICsgc2lkZUNvbW1pdC5nZXRJZCgpLmdldE5hbWUoKQotCQkJCQkrICIuXG5cbkNvbmZsaWN0czpcblx0YVxuIiwKKwkJCQkJKyAiLlxuXG4jIENvbmZsaWN0czpcbiNcdGFcbiIsCiAJCQkJCWRiLnJlYWRNZXJnZUNvbW1pdE1zZygpKTsKIAkJCWFzc2VydFRydWUobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5SRVZFUlRfSEVBRCkKIAkJCQkJLmV4aXN0cygpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3RhdHVzQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3RhdHVzQ29tbWFuZFRlc3QuamF2YQppbmRleCA1MzExZWRiLi4xOTI4MWY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXR1c0NvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGF0dXNDb21tYW5kVGVzdC5qYXZhCkBAIC0yMSw4ICsyMSwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5Ob0ZpbGVwYXR0ZXJuRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vV29ya1RyZWVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TZXRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZS5GaWxlUmVwb3NpdG9yeUJ1aWxkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC0xODEsNCArMTgzLDMxIEBAIHB1YmxpYyB2b2lkIHRlc3RGb2xkZXJQcmVmaXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJfQogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE5lc3RlZENvbW1pdHRlZEdpdFJlcG9BbmRQYXRoRmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWNvbW1pdEZpbGUoImZpbGUudHh0IiwgImZpbGUiLCAibWFzdGVyIik7CisJCXRyeSAoUmVwb3NpdG9yeSBpbm5lciA9IG5ldyBGaWxlUmVwb3NpdG9yeUJ1aWxkZXIoKQorCQkJCS5zZXRXb3JrVHJlZShuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAic3ViZ2l0IikpLmJ1aWxkKCkpIHsKKwkJCWlubmVyLmNyZWF0ZSgpOworCQkJd3JpdGVUcmFzaEZpbGUoInN1YmdpdC9zdWIudHh0IiwgInN1YiIpOworCQkJdHJ5IChHaXQgb3V0ZXJHaXQgPSBuZXcgR2l0KGRiKTsgR2l0IGlubmVyR2l0ID0gbmV3IEdpdChpbm5lcikpIHsKKwkJCQlpbm5lckdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigic3ViLnR4dCIpLmNhbGwoKTsKKwkJCQlpbm5lckdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJJbm5lciBjb21taXQiKS5jYWxsKCk7CisJCQkJb3V0ZXJHaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oInN1YmdpdCIpLmNhbGwoKTsKKwkJCQlvdXRlckdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJPdXRlciBjb21taXQiKS5jYWxsKCk7CisJCQkJYXNzZXJ0VHJ1ZShpbm5lckdpdC5zdGF0dXMoKS5jYWxsKCkuaXNDbGVhbigpKTsKKwkJCQlhc3NlcnRUcnVlKG91dGVyR2l0LnN0YXR1cygpLmNhbGwoKS5pc0NsZWFuKCkpOworCQkJCXdyaXRlVHJhc2hGaWxlKCJzdWJnaXQvc3ViLnR4dCIsICJzdWIyIik7CisJCQkJYXNzZXJ0RmFsc2UoaW5uZXJHaXQuc3RhdHVzKCkuY2FsbCgpLmlzQ2xlYW4oKSk7CisJCQkJYXNzZXJ0RmFsc2Uob3V0ZXJHaXQuc3RhdHVzKCkuY2FsbCgpLmlzQ2xlYW4oKSk7CisJCQkJYXNzZXJ0VHJ1ZSgKKwkJCQkJCW91dGVyR2l0LnN0YXR1cygpLmFkZFBhdGgoImZpbGUudHh0IikuY2FsbCgpLmlzQ2xlYW4oKSk7CisJCQkJYXNzZXJ0VHJ1ZShvdXRlckdpdC5zdGF0dXMoKS5hZGRQYXRoKCJkb2VzbnRleGlzdCIpLmNhbGwoKQorCQkJCQkJLmlzQ2xlYW4oKSk7CisJCQkJYXNzZXJ0RmFsc2UoCisJCQkJCQlvdXRlckdpdC5zdGF0dXMoKS5hZGRQYXRoKCJzdWJnaXQiKS5jYWxsKCkuaXNDbGVhbigpKTsKKwkJCX0KKwkJfQorCX0KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vQmFyZVN1cGVycHJvamVjdFdyaXRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL0JhcmVTdXBlcnByb2plY3RXcml0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiOTM4NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL0JhcmVTdXBlcnByb2plY3RXcml0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIEdvb2dsZSBJbmMuIGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNJbkFueU9yZGVyOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uQmFyZVN1cGVycHJvamVjdFdyaXRlci5CYXJlV3JpdGVyQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvQ29tbWFuZC5SZW1vdGVSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0UmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIEJhcmVTdXBlcnByb2plY3RXcml0ZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSEExX0EgPSAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSI7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgd3JpdGVfc2V0R2l0TW9kdWxlc0NvbnRlbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoUmVwb3NpdG9yeSBiYXJlUmVwbyA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCkpIHsKKwkJCVJlcG9Qcm9qZWN0IHJlcG9Qcm9qZWN0ID0gbmV3IFJlcG9Qcm9qZWN0KCJzdWJwcm9qZWN0WCIsICJwYXRoL3RvIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNoLXgiLCAicmVtb3RlIiwgIiIpOworCQkJcmVwb1Byb2plY3Quc2V0VXJsKCJodHRwOi8vZXhhbXBsZS5jb20vYSIpOworCisJCQlSZW1vdGVSZWFkZXIgbW9ja1JlbW90ZVJlYWRlciA9IG1vY2soUmVtb3RlUmVhZGVyLmNsYXNzKTsKKwkJCXdoZW4obW9ja1JlbW90ZVJlYWRlci5zaGExKCJodHRwOi8vZXhhbXBsZS5jb20vYSIsCisJCQkJCSJyZWZzL2hlYWRzL2JyYW5jaC14IikpCisJCQkJCQkJLnRoZW5SZXR1cm4oT2JqZWN0SWQuZnJvbVN0cmluZyhTSEExX0EpKTsKKworCQkJQmFyZVN1cGVycHJvamVjdFdyaXRlciB3ID0gbmV3IEJhcmVTdXBlcnByb2plY3RXcml0ZXIoYmFyZVJlcG8sCisJCQkJCW51bGwsICJyZWZzL2hlYWRzL21hc3RlciIsIGF1dGhvciwgbW9ja1JlbW90ZVJlYWRlciwKKwkJCQkJQmFyZVdyaXRlckNvbmZpZy5nZXREZWZhdWx0KCksIExpc3Qub2YoKSk7CisKKwkJCVJldkNvbW1pdCBjb21taXQgPSB3LndyaXRlKEFycmF5cy5hc0xpc3QocmVwb1Byb2plY3QpKTsKKworCQkJU3RyaW5nIGNvbnRlbnRzID0gcmVhZENvbnRlbnRzKGJhcmVSZXBvLCBjb21taXQsICIuZ2l0bW9kdWxlcyIpOworCQkJTGlzdDxTdHJpbmc+IGNvbnRlbnRMaW5lcyA9IEFycmF5cworCQkJCQkuYXNMaXN0KGNvbnRlbnRzLnNwbGl0KCJcbiIpKTsKKwkJCWFzc2VydFRoYXQoY29udGVudExpbmVzLmdldCgwKSwKKwkJCQkJaXMoIltzdWJtb2R1bGUgXCJzdWJwcm9qZWN0WFwiXSIpKTsKKwkJCWFzc2VydFRoYXQoY29udGVudExpbmVzLnN1Ykxpc3QoMSwgY29udGVudExpbmVzLnNpemUoKSksCisJCQkJCWNvbnRhaW5zSW5BbnlPcmRlcihpcygiXHRicmFuY2ggPSByZWZzL2hlYWRzL2JyYW5jaC14IiksCisJCQkJCQkJaXMoIlx0cGF0aCA9IHBhdGgvdG8iKSwKKwkJCQkJCQlpcygiXHR1cmwgPSBodHRwOi8vZXhhbXBsZS5jb20vYSIpKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHdyaXRlX3NldEV4dHJhQ29udGVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChSZXBvc2l0b3J5IGJhcmVSZXBvID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKSkgeworCQkJUmVwb1Byb2plY3QgcmVwb1Byb2plY3QgPSBuZXcgUmVwb1Byb2plY3QoInN1YnByb2plY3RYIiwgInBhdGgvdG8iLAorCQkJCQkicmVmcy9oZWFkcy9icmFuY2gteCIsICJyZW1vdGUiLCAiIik7CisJCQlyZXBvUHJvamVjdC5zZXRVcmwoImh0dHA6Ly9leGFtcGxlLmNvbS9hIik7CisKKwkJCVJlbW90ZVJlYWRlciBtb2NrUmVtb3RlUmVhZGVyID0gbW9jayhSZW1vdGVSZWFkZXIuY2xhc3MpOworCQkJd2hlbihtb2NrUmVtb3RlUmVhZGVyLnNoYTEoImh0dHA6Ly9leGFtcGxlLmNvbS9hIiwKKwkJCQkJInJlZnMvaGVhZHMvYnJhbmNoLXgiKSkKKwkJCQkJCQkudGhlblJldHVybihPYmplY3RJZC5mcm9tU3RyaW5nKFNIQTFfQSkpOworCisJCQlCYXJlU3VwZXJwcm9qZWN0V3JpdGVyIHcgPSBuZXcgQmFyZVN1cGVycHJvamVjdFdyaXRlcihiYXJlUmVwbywKKwkJCQkJbnVsbCwgInJlZnMvaGVhZHMvbWFzdGVyIiwgYXV0aG9yLCBtb2NrUmVtb3RlUmVhZGVyLAorCQkJCQlCYXJlV3JpdGVyQ29uZmlnLmdldERlZmF1bHQoKSwKKwkJCQkJTGlzdC5vZihuZXcgQmFyZVN1cGVycHJvamVjdFdyaXRlci5FeHRyYUNvbnRlbnQoIngiLAorCQkJCQkJCSJleHRyYS1jb250ZW50IikpKTsKKworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IHcud3JpdGUoQXJyYXlzLmFzTGlzdChyZXBvUHJvamVjdCkpOworCisJCQlTdHJpbmcgY29udGVudHMgPSByZWFkQ29udGVudHMoYmFyZVJlcG8sIGNvbW1pdCwgIngiKTsKKwkJCWFzc2VydFRoYXQoY29udGVudHMsIGlzKCJleHRyYS1jb250ZW50IikpOworCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgcmVhZENvbnRlbnRzKFJlcG9zaXRvcnkgcmVwbywgUmV2Q29tbWl0IGNvbW1pdCwKKwkJCVN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgcGF0aDsKKwkJT2JqZWN0SWQgbW9kSWQgPSByZXBvLnJlc29sdmUoaWRTdHIpOworCQl0cnkgKE9iamVjdFJlYWRlciByZWFkZXIgPSByZXBvLm5ld09iamVjdFJlYWRlcigpKSB7CisJCQlyZXR1cm4gbmV3IFN0cmluZygKKwkJCQkJcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKSwKKwkJCQkJU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEKaW5kZXggNTA5YWRjMi4uM2U2ZDEzYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwpAQCAtNTQ2LDI0ICs1NDcsMjkgQEAgcHVibGljIHZvaWQgdGVzdFJlcG9NYW5pZmVzdENvcHlGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRoZSBvcmlnaW5hbCBmaWxlIHNob3VsZCBleGlzdAogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwogCQlhc3NlcnRUcnVlKCJUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgbm90IGJlIGV4ZWN1dGFibGUiLAotCQkJCWhlbGxvLmNhbkV4ZWN1dGUoKSk7CisJCWlmIChGUy5ERVRFQ1RFRC5zdXBwb3J0c0V4ZWN1dGUoKSkgeworCQkJYXNzZXJ0RmFsc2UoIlRoZSBvcmlnaW5hbCBmaWxlIHNob3VsZCBub3QgYmUgZXhlY3V0YWJsZSIsCisJCQkJCUZTLkRFVEVDVEVELmNhbkV4ZWN1dGUoaGVsbG8pKTsKKwkJfQogCQlhc3NlcnRDb250ZW50cyhoZWxsby50b1BhdGgoKSwgIm1hc3RlciB3b3JsZCIpOwogCQkvLyBUaGUgZGVzdCBmaWxlIHNob3VsZCBhbHNvIGV4aXN0CiAJCWhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiSGVsbG8iKTsKIAkJYXNzZXJ0VHJ1ZSgiVGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIG5vdCBiZSBleGVjdXRhYmxlIiwKLQkJCQloZWxsby5jYW5FeGVjdXRlKCkpOworCQlpZiAoRlMuREVURUNURUQuc3VwcG9ydHNFeGVjdXRlKCkpIHsKKwkJCWFzc2VydEZhbHNlKCJUaGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgbm90IGJlIGV4ZWN1dGFibGUiLAorCQkJCQlGUy5ERVRFQ1RFRC5jYW5FeGVjdXRlKGhlbGxvKSk7CisJCX0KIAkJYXNzZXJ0Q29udGVudHMoaGVsbG8udG9QYXRoKCksICJtYXN0ZXIgd29ybGQiKTsKIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvTWFuaWZlc3RDb3B5RmlsZV9leGVjdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc3VtZVRydWUoRlMuREVURUNURUQuc3VwcG9ydHNFeGVjdXRlKCkpOwogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRlZmF1bHREYikpIHsKIAkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKIAkJCUZpbGUgZiA9IEpHaXRUZXN0VXRpbC53cml0ZVRyYXNoRmlsZShkZWZhdWx0RGIsICJoZWxsby5zaCIsCiAJCQkJCSJjb250ZW50IG9mIHRoZSBleGVjdXRhYmxlIGZpbGUiKTsKLQkJCWYuc2V0RXhlY3V0YWJsZSh0cnVlKTsKKwkJCUZTLkRFVEVDVEVELnNldEV4ZWN1dGUoZiwgdHJ1ZSk7CiAJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImhlbGxvLnNoIikuY2FsbCgpOwogCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIkFkZCBiaW5hcnkgZmlsZSIpLmNhbGwoKTsKIAkJfQpAQCAtNTg4LDcgKzU5NCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXBvTWFuaWZlc3RDb3B5RmlsZV9leGVjdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRoZSBvcmlnaW5hbCBmaWxlIHNob3VsZCBleGlzdCBhbmQgYmUgYW4gZXhlY3V0YWJsZQogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnNoIik7CiAJCWFzc2VydFRydWUoIlRoZSBvcmlnaW5hbCBmaWxlIHNob3VsZCBleGlzdCIsIGhlbGxvLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIG9yaWdpbmFsIGZpbGUgbXVzdCBiZSBleGVjdXRhYmxlIiwgaGVsbG8uY2FuRXhlY3V0ZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgiVGhlIG9yaWdpbmFsIGZpbGUgbXVzdCBiZSBleGVjdXRhYmxlIiwKKwkJCQlGUy5ERVRFQ1RFRC5jYW5FeGVjdXRlKGhlbGxvKSk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gRmlsZXMubmV3QnVmZmVyZWRSZWFkZXIoaGVsbG8udG9QYXRoKCksCiAJCQkJVVRGXzgpKSB7CiAJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwpAQCAtNjAwLDcgKzYwNyw3IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXBvTWFuaWZlc3RDb3B5RmlsZV9leGVjdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiY29weS1oZWxsby5zaCIpOwogCQlhc3NlcnRUcnVlKCJUaGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7CiAJCWFzc2VydFRydWUoIlRoZSBkZXN0aW5hdGlvbiBmaWxlIG11c3QgYmUgZXhlY3V0YWJsZSIsCi0JCQkJaGVsbG8uY2FuRXhlY3V0ZSgpKTsKKwkJCQlGUy5ERVRFQ1RFRC5jYW5FeGVjdXRlKGhlbGxvKSk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gRmlsZXMubmV3QnVmZmVyZWRSZWFkZXIoaGVsbG8udG9QYXRoKCksCiAJCQkJVVRGXzgpKSB7CiAJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRXh0ZXJuYWxEaWZmVG9vbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsRGlmZlRvb2xUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllYmVjNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsRGlmZlRvb2xUZXN0LmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMSwgU2ltZW9uIEFuZHJlZXYgPHNpbWVvbi5kYW5haWxvdi5hbmRyZWV2QGdtYWlsLmNvbT4gYW5kIG90aGVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0RJRkZUT09MX1NFQ1RJT047CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0NNRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfR1VJVE9PTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUEFUSDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUFJPTVBUOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UUlVTVF9FWElUX0NPREU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWwuQm9vbGVhblRyaVN0YXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0aW5nIGV4dGVybmFsIGRpZmYgdG9vbHMuCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbERpZmZUb29sVGVzdCBleHRlbmRzIEV4dGVybmFsVG9vbFRlc3RDYXNlIHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvb2xOYW1lcygpIHsKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKwkJU2V0PFN0cmluZz4gYWN0dWFsVG9vbE5hbWVzID0gbWFuYWdlci5nZXRUb29sTmFtZXMoKTsKKwkJU2V0PFN0cmluZz4gZXhwZWN0ZWRUb29sTmFtZXMgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzZXQgb2YgZXh0ZXJuYWwgZGlmZiB0b29sIG5hbWVzIiwKKwkJCQlleHBlY3RlZFRvb2xOYW1lcywgYWN0dWFsVG9vbE5hbWVzKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RBbGxUb29scygpIHsKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKwkJU2V0PFN0cmluZz4gYWN0dWFsVG9vbE5hbWVzID0gbWFuYWdlci5nZXRBdmFpbGFibGVUb29scygpLmtleVNldCgpOworCQlTZXQ8U3RyaW5nPiBleHBlY3RlZFRvb2xOYW1lcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKwkJQ29tbWFuZExpbmVEaWZmVG9vbFtdIGRlZmF1bHRUb29scyA9IENvbW1hbmRMaW5lRGlmZlRvb2wudmFsdWVzKCk7CisJCWZvciAoQ29tbWFuZExpbmVEaWZmVG9vbCBkZWZhdWx0VG9vbCA6IGRlZmF1bHRUb29scykgeworCQkJU3RyaW5nIHRvb2xOYW1lID0gZGVmYXVsdFRvb2wubmFtZSgpOworCQkJZXhwZWN0ZWRUb29sTmFtZXMuYWRkKHRvb2xOYW1lKTsKKwkJfQorCQlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBzZXQgb2YgZXh0ZXJuYWwgZGlmZiB0b29scyIsIGV4cGVjdGVkVG9vbE5hbWVzLAorCQkJCWFjdHVhbFRvb2xOYW1lcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVQcmVkZWZpbmVkVG9vbFBhdGgoKSB7CisJCVN0cmluZyB0b29sTmFtZSA9IENvbW1hbmRMaW5lRGlmZlRvb2wuZ3VpZmZ5Lm5hbWUoKTsKKwkJU3RyaW5nIGN1c3RvbVRvb2xQYXRoID0gIi91c3IvYmluL2VjaG8iOworCisJCUZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBkYi5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgdG9vbE5hbWUsIENPTkZJR19LRVlfQ01ELAorCQkJCSJlY2hvIik7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIHRvb2xOYW1lLCBDT05GSUdfS0VZX1BBVEgsCisJCQkJY3VzdG9tVG9vbFBhdGgpOworCisJCURpZmZUb29scyBtYW5hZ2VyID0gbmV3IERpZmZUb29scyhkYik7CisJCU1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IHRvb2xzID0gbWFuYWdlci5nZXRVc2VyRGVmaW5lZFRvb2xzKCk7CisJCUV4dGVybmFsRGlmZlRvb2wgZGlmZlRvb2wgPSB0b29scy5nZXQodG9vbE5hbWUpOworCQlhc3NlcnROb3ROdWxsKCJFeHBlY3RlZCB0b29sIFwiIiArIHRvb2xOYW1lICsgIlwiIHRvIGJlIHVzZXIgZGVmaW5lZCIsCisJCQkJZGlmZlRvb2wpOworCisJCVN0cmluZyB0b29sUGF0aCA9IGRpZmZUb29sLmdldFBhdGgoKTsKKwkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBleHRlcm5hbCBkaWZmIHRvb2wgdG8gaGF2ZSBhbiBvdmVycmlkZW4gcGF0aCIsCisJCQkJY3VzdG9tVG9vbFBhdGgsIHRvb2xQYXRoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RVc2VyRGVmaW5lZFRvb2xzKCkgeworCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCVN0cmluZyBjdXN0b21Ub29sbmFtZSA9ICJjdXN0b21Ub29sIjsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgY3VzdG9tVG9vbG5hbWUsCisJCQkJQ09ORklHX0tFWV9DTUQsICJlY2hvIik7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ09ORklHX0RJRkZUT09MX1NFQ1RJT04sIGN1c3RvbVRvb2xuYW1lLAorCQkJCUNPTkZJR19LRVlfUEFUSCwgIi91c3IvYmluL2VjaG8iKTsKKwkJY29uZmlnLnNldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgY3VzdG9tVG9vbG5hbWUsCisJCQkJQ09ORklHX0tFWV9QUk9NUFQsICItLW5vLXByb21wdCIpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sbmFtZSwKKwkJCQlDT05GSUdfS0VZX0dVSVRPT0wsICItLW5vLWd1aSIpOworCQljb25maWcuc2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBjdXN0b21Ub29sbmFtZSwKKwkJCQlDT05GSUdfS0VZX1RSVVNUX0VYSVRfQ09ERSwgIi0tbm8tdHJ1c3QtZXhpdC1jb2RlIik7CisJCURpZmZUb29scyBtYW5hZ2VyID0gbmV3IERpZmZUb29scyhkYik7CisJCVNldDxTdHJpbmc+IGFjdHVhbFRvb2xOYW1lcyA9IG1hbmFnZXIuZ2V0VXNlckRlZmluZWRUb29scygpLmtleVNldCgpOworCQlTZXQ8U3RyaW5nPiBleHBlY3RlZFRvb2xOYW1lcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKwkJZXhwZWN0ZWRUb29sTmFtZXMuYWRkKGN1c3RvbVRvb2xuYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2V0IG9mIGV4dGVybmFsIGRpZmYgdG9vbHMiLCBleHBlY3RlZFRvb2xOYW1lcywKKwkJCQlhY3R1YWxUb29sTmFtZXMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdE5vdEF2YWlsYWJsZVRvb2xzKCkgeworCQlEaWZmVG9vbHMgbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOworCQlTZXQ8U3RyaW5nPiBhY3R1YWxUb29sTmFtZXMgPSBtYW5hZ2VyLmdldE5vdEF2YWlsYWJsZVRvb2xzKCkua2V5U2V0KCk7CisJCVNldDxTdHJpbmc+IGV4cGVjdGVkVG9vbE5hbWVzID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKwkJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3Qgc2V0IG9mIG5vdCBhdmFpbGFibGUgZXh0ZXJuYWwgZGlmZiB0b29scyIsCisJCQkJZXhwZWN0ZWRUb29sTmFtZXMsIGFjdHVhbFRvb2xOYW1lcyk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSgpIHsKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKworCQlTdHJpbmcgbmV3UGF0aCA9ICIiOworCQlTdHJpbmcgb2xkUGF0aCA9ICIiOworCQlTdHJpbmcgbmV3SWQgPSAiIjsKKwkJU3RyaW5nIG9sZElkID0gIiI7CisJCVN0cmluZyB0b29sTmFtZSA9ICIiOworCQlCb29sZWFuVHJpU3RhdGUgcHJvbXB0ID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCQlCb29sZWFuVHJpU3RhdGUgZ3VpID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCQlCb29sZWFuVHJpU3RhdGUgdHJ1c3RFeGl0Q29kZSA9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVDsKKworCQlpbnQgZXhwZWN0ZWRDb21wYXJlUmVzdWx0ID0gMDsKKwkJaW50IGNvbXBhcmVSZXN1bHQgPSBtYW5hZ2VyLmNvbXBhcmUobmV3UGF0aCwgb2xkUGF0aCwgbmV3SWQsIG9sZElkLAorCQkJCXRvb2xOYW1lLCBwcm9tcHQsIGd1aSwgdHJ1c3RFeGl0Q29kZSk7CisJCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGNvbXBhcmUgcmVzdWx0IGZvciBleHRlcm5hbCBkaWZmIHRvb2wiLAorCQkJCWV4cGVjdGVkQ29tcGFyZVJlc3VsdCwgY29tcGFyZVJlc3VsdCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IGRiLmdldENvbmZpZygpOworCQkvLyB0aGUgZGVmYXVsdCBkaWZmIHRvb2wgaXMgY29uZmlndXJlZCB3aXRob3V0IGEgc3Vic2VjdGlvbgorCQlTdHJpbmcgc3Vic2VjdGlvbiA9IG51bGw7CisJCWNvbmZpZy5zZXRTdHJpbmcoImRpZmYiLCBzdWJzZWN0aW9uLCAidG9vbCIsICJjdXN0b21Ub29sIik7CisKKwkJRGlmZlRvb2xzIG1hbmFnZXIgPSBuZXcgRGlmZlRvb2xzKGRiKTsKKwkJQm9vbGVhblRyaVN0YXRlIGd1aSA9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVDsKKwkJU3RyaW5nIGRlZmF1bHRUb29sTmFtZSA9IG1hbmFnZXIuZ2V0RGVmYXVsdFRvb2xOYW1lKGd1aSk7CisJCWFzc2VydEVxdWFscygKKwkJCQkiRXhwZWN0ZWQgY29uZmlndXJlZCBkaWZmdG9vbCB0byBiZSB0aGUgZGVmYXVsdCBleHRlcm5hbCBkaWZmIHRvb2wiLAorCQkJCSJteV9kZWZhdWx0X3Rvb2xuYW1lIiwgZGVmYXVsdFRvb2xOYW1lKTsKKworCQlndWkgPSBCb29sZWFuVHJpU3RhdGUuVFJVRTsKKwkJU3RyaW5nIGRlZmF1bHRHdWlUb29sTmFtZSA9IG1hbmFnZXIuZ2V0RGVmYXVsdFRvb2xOYW1lKGd1aSk7CisJCWFzc2VydEVxdWFscygKKwkJCQkiRXhwZWN0ZWQgY29uZmlndXJlZCBkaWZmdG9vbCB0byBiZSB0aGUgZGVmYXVsdCBleHRlcm5hbCBkaWZmIHRvb2wiLAorCQkJCSJteV9ndWlfdG9vbCIsIGRlZmF1bHRHdWlUb29sTmFtZSk7CisKKwkJY29uZmlnLnNldFN0cmluZygiZGlmZiIsIHN1YnNlY3Rpb24sICJndWl0b29sIiwgImN1c3RvbUd1aVRvb2wiKTsKKwkJbWFuYWdlciA9IG5ldyBEaWZmVG9vbHMoZGIpOworCQlkZWZhdWx0R3VpVG9vbE5hbWUgPSBtYW5hZ2VyLmdldERlZmF1bHRUb29sTmFtZShndWkpOworCQlhc3NlcnRFcXVhbHMoCisJCQkJIkV4cGVjdGVkIGNvbmZpZ3VyZWQgZGlmZnRvb2wgdG8gYmUgdGhlIGRlZmF1bHQgZXh0ZXJuYWwgZGlmZiBndWl0b29sIiwKKwkJCQkibXlfZ3VpX3Rvb2wiLCBkZWZhdWx0R3VpVG9vbE5hbWUpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsVG9vbFRlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbFRvb2xUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzEyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbFRvb2xUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAtMjAyMSwgU2ltZW9uIEFuZHJlZXYgPHNpbWVvbi5kYW5haWxvdi5hbmRyZWV2QGdtYWlsLmNvbT4gYW5kIG90aGVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GU19QT1NJWDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworCisvKioKKyAqIEJhc2UgdGVzdCBjYXNlIGZvciBleHRlcm5hbCBtZXJnZSBhbmQgZGlmZiB0b29sIHRlc3RzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZXJuYWxUb29sVGVzdENhc2UgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URU5UID0gImxpbmUxIjsKKworCXByb3RlY3RlZCBGaWxlIGxvY2FsRmlsZTsKKworCXByb3RlY3RlZCBGaWxlIHJlbW90ZUZpbGU7CisKKwlwcm90ZWN0ZWQgRmlsZSBtZXJnZWRGaWxlOworCisJcHJvdGVjdGVkIEZpbGUgYmFzZUZpbGU7CisKKwlwcm90ZWN0ZWQgRmlsZSBjb21tYW5kUmVzdWx0OworCisJQEJlZm9yZQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisKKwkJbG9jYWxGaWxlID0gd3JpdGVUcmFzaEZpbGUoImxvY2FsRmlsZS50eHQiLCBERUZBVUxUX0NPTlRFTlQgKyAiXG4iKTsKKwkJbG9jYWxGaWxlLmRlbGV0ZU9uRXhpdCgpOworCQlyZW1vdGVGaWxlID0gd3JpdGVUcmFzaEZpbGUoInJlbW90ZUZpbGUudHh0IiwgREVGQVVMVF9DT05URU5UICsgIlxuIik7CisJCXJlbW90ZUZpbGUuZGVsZXRlT25FeGl0KCk7CisJCW1lcmdlZEZpbGUgPSB3cml0ZVRyYXNoRmlsZSgibWVyZ2VkRmlsZS50eHQiLCAiIik7CisJCW1lcmdlZEZpbGUuZGVsZXRlT25FeGl0KCk7CisJCWJhc2VGaWxlID0gd3JpdGVUcmFzaEZpbGUoImJhc2VGaWxlLnR4dCIsICIiKTsKKwkJYmFzZUZpbGUuZGVsZXRlT25FeGl0KCk7CisJCWNvbW1hbmRSZXN1bHQgPSB3cml0ZVRyYXNoRmlsZSgiY29tbWFuZFJlc3VsdC50eHQiLCAiIik7CisJCWNvbW1hbmRSZXN1bHQuZGVsZXRlT25FeGl0KCk7CisJfQorCisJQEFmdGVyCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmlsZXMuZGVsZXRlKGxvY2FsRmlsZS50b1BhdGgoKSk7CisJCUZpbGVzLmRlbGV0ZShyZW1vdGVGaWxlLnRvUGF0aCgpKTsKKwkJRmlsZXMuZGVsZXRlKG1lcmdlZEZpbGUudG9QYXRoKCkpOworCQlGaWxlcy5kZWxldGUoYmFzZUZpbGUudG9QYXRoKCkpOworCQlGaWxlcy5kZWxldGUoY29tbWFuZFJlc3VsdC50b1BhdGgoKSk7CisKKwkJc3VwZXIudGVhckRvd24oKTsKKwl9CisKKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhc3N1bWVQb3NpeFBsYXRmb3JtKCkgeworCQlBc3N1bWUuYXNzdW1lVHJ1ZSgKKwkJCQkiVGhpcyB0ZXN0IGNhbiBydW4gb25seSBpbiBMaW51eCB0ZXN0cyIsCisJCQkJRlMuREVURUNURUQgaW5zdGFuY2VvZiBGU19QT1NJWCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZVRlc3QuamF2YQppbmRleCA0ZjEzMTQwLi5hYjU4OGNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZVRlc3QuamF2YQpAQCAtMTUsMTYgKzE1LDE5IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKK2ltcG9ydCBqYXZhLnRpbWUuRHVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkxvbmdTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuRGZzQmxvY2tDYWNoZUNvbmZpZy5JbmRleEV2ZW50Q29uc3VtZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2suUGFja0V4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJuZzsKQEAgLTE1NCw2ICsxNTcsMTE5IEBAIHB1YmxpYyB2b2lkIGhhc0NhY2hlSG90TWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogCUBUZXN0CisJcHVibGljIHZvaWQgaGFzSW5kZXhFdmVudENvbnN1bWVyT25seUxvYWRlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlBdG9taWNJbnRlZ2VyIGxvYWRlZCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisJCUluZGV4RXZlbnRDb25zdW1lciBpbmRleEV2ZW50Q29uc3VtZXIgPSBuZXcgSW5kZXhFdmVudENvbnN1bWVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBhY2NlcHRSZXF1ZXN0ZWRFdmVudChpbnQgcGFja0V4dFBvcywgYm9vbGVhbiBjYWNoZUhpdCwKKwkJCQkJbG9uZyBsb2FkTWljcm9zLCBsb25nIGJ5dGVzLAorCQkJCQlEdXJhdGlvbiBsYXN0RXZpY3Rpb25EdXJhdGlvbikgeworCQkJCWFzc2VydEVxdWFscyhQYWNrRXh0LklOREVYLmdldFBvc2l0aW9uKCksIHBhY2tFeHRQb3MpOworCQkJCWFzc2VydFRydWUoY2FjaGVIaXQpOworCQkJCWFzc2VydFRydWUobGFzdEV2aWN0aW9uRHVyYXRpb24uaXNaZXJvKCkpOworCQkJCWxvYWRlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKwkJCX0KKwkJfTsKKworCQlEZnNCbG9ja0NhY2hlLnJlY29uZmlndXJlKG5ldyBEZnNCbG9ja0NhY2hlQ29uZmlnKCkuc2V0QmxvY2tTaXplKDUxMikKKwkJCQkuc2V0QmxvY2tMaW1pdCg1MTIgKiA0KQorCQkJCS5zZXRJbmRleEV2ZW50Q29uc3VtZXIoaW5kZXhFdmVudENvbnN1bWVyKSk7CisJCWNhY2hlID0gRGZzQmxvY2tDYWNoZS5nZXRJbnN0YW5jZSgpOworCisJCURmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbiByZXBvID0gbmV3IERmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbigidGVzdCIpOworCQlJbk1lbW9yeVJlcG9zaXRvcnkgcjEgPSBuZXcgSW5NZW1vcnlSZXBvc2l0b3J5KHJlcG8pOworCQlieXRlW10gY29udGVudCA9IHJuZy5uZXh0Qnl0ZXMoNDI0MjQyKTsKKwkJT2JqZWN0SWQgaWQ7CisJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgaW5zID0gcjEubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgeworCQkJaWQgPSBpbnMuaW5zZXJ0KE9CSl9CTE9CLCBjb250ZW50KTsKKwkJCWlucy5mbHVzaCgpOworCQl9CisKKwkJdHJ5IChPYmplY3RSZWFkZXIgcmRyID0gcjEubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCWJ5dGVbXSBhY3R1YWwgPSByZHIub3BlbihpZCwgT0JKX0JMT0IpLmdldEJ5dGVzKCk7CisJCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoY29udGVudCwgYWN0dWFsKSk7CisJCX0KKwkJLy8gQWxsIGNhY2hlIGVudHJpZXMgYXJlIGhvdCBhbmQgY2FjaGUgaXMgYXQgY2FwYWNpdHkuCisJCWFzc2VydFRydWUoTG9uZ1N0cmVhbS5vZihjYWNoZS5nZXRIaXRDb3VudCgpKS5zdW0oKSA+IDApOworCQlhc3NlcnRFcXVhbHMoOTksIGNhY2hlLmdldEZpbGxQZXJjZW50YWdlKCkpOworCisJCUluTWVtb3J5UmVwb3NpdG9yeSByMiA9IG5ldyBJbk1lbW9yeVJlcG9zaXRvcnkocmVwbyk7CisJCWNvbnRlbnQgPSBybmcubmV4dEJ5dGVzKDQyNDI0Mik7CisJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgaW5zID0gcjIubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgeworCQkJaW5zLmluc2VydChPQkpfQkxPQiwgY29udGVudCk7CisJCQlpbnMuZmx1c2goKTsKKwkJfQorCQlhc3NlcnRUcnVlKGNhY2hlLmdldEV2aWN0aW9ucygpW1BhY2tFeHQuUEFDSy5nZXRQb3NpdGlvbigpXSA+IDApOworCQlhc3NlcnRFcXVhbHMoMSwgY2FjaGUuZ2V0RXZpY3Rpb25zKClbUGFja0V4dC5JTkRFWC5nZXRQb3NpdGlvbigpXSk7CisJCWFzc2VydEVxdWFscygxLCBsb2FkZWQuZ2V0KCkpOworCX0KKworCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBoYXNJbmRleEV2ZW50Q29uc3VtZXJMb2FkZWRBbmRFdmljdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUF0b21pY0ludGVnZXIgbG9hZGVkID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwkJQXRvbWljSW50ZWdlciBldmljdGVkID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwkJSW5kZXhFdmVudENvbnN1bWVyIGluZGV4RXZlbnRDb25zdW1lciA9IG5ldyBJbmRleEV2ZW50Q29uc3VtZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdFJlcXVlc3RlZEV2ZW50KGludCBwYWNrRXh0UG9zLCBib29sZWFuIGNhY2hlSGl0LAorCQkJCQlsb25nIGxvYWRNaWNyb3MsIGxvbmcgYnl0ZXMsCisJCQkJCUR1cmF0aW9uIGxhc3RFdmljdGlvbkR1cmF0aW9uKSB7CisJCQkJYXNzZXJ0RXF1YWxzKFBhY2tFeHQuSU5ERVguZ2V0UG9zaXRpb24oKSwgcGFja0V4dFBvcyk7CisJCQkJYXNzZXJ0VHJ1ZShjYWNoZUhpdCk7CisJCQkJYXNzZXJ0VHJ1ZShsYXN0RXZpY3Rpb25EdXJhdGlvbi5pc1plcm8oKSk7CisJCQkJbG9hZGVkLmluY3JlbWVudEFuZEdldCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGFjY2VwdEV2aWN0ZWRFdmVudChpbnQgcGFja0V4dFBvcywgbG9uZyBieXRlcywKKwkJCQkJaW50IHRvdGFsQ2FjaGVIaXRDb3VudCwgRHVyYXRpb24gbGFzdEV2aWN0aW9uRHVyYXRpb24pIHsKKwkJCQlhc3NlcnRFcXVhbHMoUGFja0V4dC5JTkRFWC5nZXRQb3NpdGlvbigpLCBwYWNrRXh0UG9zKTsKKwkJCQlhc3NlcnRUcnVlKHRvdGFsQ2FjaGVIaXRDb3VudCA+IDApOworCQkJCWFzc2VydFRydWUobGFzdEV2aWN0aW9uRHVyYXRpb24uaXNaZXJvKCkpOworCQkJCWV2aWN0ZWQuaW5jcmVtZW50QW5kR2V0KCk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gc2hvdWxkUmVwb3J0RXZpY3RlZEV2ZW50KCkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9OworCisJCURmc0Jsb2NrQ2FjaGUucmVjb25maWd1cmUobmV3IERmc0Jsb2NrQ2FjaGVDb25maWcoKS5zZXRCbG9ja1NpemUoNTEyKQorCQkJCS5zZXRCbG9ja0xpbWl0KDUxMiAqIDQpCisJCQkJLnNldEluZGV4RXZlbnRDb25zdW1lcihpbmRleEV2ZW50Q29uc3VtZXIpKTsKKwkJY2FjaGUgPSBEZnNCbG9ja0NhY2hlLmdldEluc3RhbmNlKCk7CisKKwkJRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uIHJlcG8gPSBuZXcgRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uKCJ0ZXN0Iik7CisJCUluTWVtb3J5UmVwb3NpdG9yeSByMSA9IG5ldyBJbk1lbW9yeVJlcG9zaXRvcnkocmVwbyk7CisJCWJ5dGVbXSBjb250ZW50ID0gcm5nLm5leHRCeXRlcyg0MjQyNDIpOworCQlPYmplY3RJZCBpZDsKKwkJdHJ5IChPYmplY3RJbnNlcnRlciBpbnMgPSByMS5uZXdPYmplY3RJbnNlcnRlcigpKSB7CisJCQlpZCA9IGlucy5pbnNlcnQoT0JKX0JMT0IsIGNvbnRlbnQpOworCQkJaW5zLmZsdXNoKCk7CisJCX0KKworCQl0cnkgKE9iamVjdFJlYWRlciByZHIgPSByMS5uZXdPYmplY3RSZWFkZXIoKSkgeworCQkJYnl0ZVtdIGFjdHVhbCA9IHJkci5vcGVuKGlkLCBPQkpfQkxPQikuZ2V0Qnl0ZXMoKTsKKwkJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhjb250ZW50LCBhY3R1YWwpKTsKKwkJfQorCQkvLyBBbGwgY2FjaGUgZW50cmllcyBhcmUgaG90IGFuZCBjYWNoZSBpcyBhdCBjYXBhY2l0eS4KKwkJYXNzZXJ0VHJ1ZShMb25nU3RyZWFtLm9mKGNhY2hlLmdldEhpdENvdW50KCkpLnN1bSgpID4gMCk7CisJCWFzc2VydEVxdWFscyg5OSwgY2FjaGUuZ2V0RmlsbFBlcmNlbnRhZ2UoKSk7CisKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHIyID0gbmV3IEluTWVtb3J5UmVwb3NpdG9yeShyZXBvKTsKKwkJY29udGVudCA9IHJuZy5uZXh0Qnl0ZXMoNDI0MjQyKTsKKwkJdHJ5IChPYmplY3RJbnNlcnRlciBpbnMgPSByMi5uZXdPYmplY3RJbnNlcnRlcigpKSB7CisJCQlpbnMuaW5zZXJ0KE9CSl9CTE9CLCBjb250ZW50KTsKKwkJCWlucy5mbHVzaCgpOworCQl9CisJCWFzc2VydFRydWUoY2FjaGUuZ2V0RXZpY3Rpb25zKClbUGFja0V4dC5QQUNLLmdldFBvc2l0aW9uKCldID4gMCk7CisJCWFzc2VydEVxdWFscygxLCBjYWNoZS5nZXRFdmljdGlvbnMoKVtQYWNrRXh0LklOREVYLmdldFBvc2l0aW9uKCldKTsKKwkJYXNzZXJ0RXF1YWxzKDEsIGxvYWRlZC5nZXQoKSk7CisJCWFzc2VydEVxdWFscygxLCBldmljdGVkLmdldCgpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIG5vQ29uY3VycmVuY3lTZXJpYWxpemVkUmVhZHNfb25lUmVwbygpIHRocm93cyBFeGNlcHRpb24gewogCQlJbk1lbW9yeVJlcG9zaXRvcnkgcjEgPSBjcmVhdGVSZXBvV2l0aEJpdG1hcCgidGVzdCIpOwogCQkvLyBSZXNldCBjYWNoZSB3aXRoIGNvbmN1cnJlbmN5IExldmVsIGF0IDEgaS5lLiBubyBjb25jdXJyZW5jeS4KQEAgLTI2Nyw3ICszODMsNiBAQCBwdWJsaWMgdm9pZCBsb3dDb25jdXJyZW5jeVBhcmFsbGVsUmVhZHNfdHdvUmVwb3NBbmRJbmRleCgpCiAJCWFzc2VydEVxdWFscygyLCBjYWNoZS5nZXRNaXNzQ291bnQoKVswXSk7CiAJfQogCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKIAlAVGVzdAogCXB1YmxpYyB2b2lkIGhpZ2hDb25jdXJyZW5jeVBhcmFsbGVsUmVhZHNfb25lUmVwbygpIHRocm93cyBFeGNlcHRpb24gewogCQlJbk1lbW9yeVJlcG9zaXRvcnkgcjEgPSBjcmVhdGVSZXBvV2l0aEJpdG1hcCgidGVzdCIpOwpAQCAtMjkwLDYgKzQwNSwzMCBAQCBwdWJsaWMgdm9pZCBoaWdoQ29uY3VycmVuY3lQYXJhbGxlbFJlYWRzX29uZVJlcG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKDEsIGNhY2hlLmdldE1pc3NDb3VudCgpWzBdKTsKIAl9CiAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGhpZ2hDb25jdXJyZW5jeVBhcmFsbGVsUmVhZHNfb25lUmVwb1BhcmFsbGVsUmV2ZXJzZUluZGV4KCkKKwkJCXRocm93cyBFeGNlcHRpb24geworCQlJbk1lbW9yeVJlcG9zaXRvcnkgcjEgPSBjcmVhdGVSZXBvV2l0aEJpdG1hcCgidGVzdCIpOworCQlyZXNldENhY2hlKCk7CisKKwkJRGZzUmVhZGVyIHJlYWRlciA9IChEZnNSZWFkZXIpIHIxLm5ld09iamVjdFJlYWRlcigpOworCQlyZWFkZXIuZ2V0T3B0aW9ucygpLnNldExvYWRSZXZJbmRleEluUGFyYWxsZWwodHJ1ZSk7CisJCWZvciAoRGZzUGFja0ZpbGUgcGFjayA6IHIxLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0UGFja3MoKSkgeworCQkJLy8gT25seSBsb2FkIG5vbi1nYXJiYWdlIHBhY2sgd2l0aCBiaXRtYXAuCisJCQlpZiAocGFjay5pc0dhcmJhZ2UoKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYXN5bmNSdW4oKCkgLT4gcGFjay5nZXRCaXRtYXBJbmRleChyZWFkZXIpKTsKKwkJCWFzeW5jUnVuKCgpIC0+IHBhY2suZ2V0UGFja0luZGV4KHJlYWRlcikpOworCQkJYXN5bmNSdW4oKCkgLT4gcGFjay5nZXRCaXRtYXBJbmRleChyZWFkZXIpKTsKKwkJfQorCQl3YWl0Rm9yRXhlY3V0b3JQb29sVGVybWluYXRpb24oKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgY2FjaGUuZ2V0TWlzc0NvdW50KClbUGFja0V4dC5CSVRNQVBfSU5ERVgub3JkaW5hbCgpXSk7CisJCWFzc2VydEVxdWFscygxLCBjYWNoZS5nZXRNaXNzQ291bnQoKVtQYWNrRXh0LklOREVYLm9yZGluYWwoKV0pOworCQlhc3NlcnRFcXVhbHMoMSwgY2FjaGUuZ2V0TWlzc0NvdW50KClbMF0pOworCX0KKwogCXByaXZhdGUgdm9pZCByZXNldENhY2hlKCkgewogCQlyZXNldENhY2hlKDMyKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JhdGNoUmVmVXBkYXRlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CYXRjaFJlZlVwZGF0ZVRlc3QuamF2YQppbmRleCA2MzU3YTBiLi5kYWY0MzgyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JhdGNoUmVmVXBkYXRlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQmF0Y2hSZWZVcGRhdGVUZXN0LmphdmEKQEAgLTQyLDYgKzQyLDggQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ldmVudHMuTGlzdGVuZXJIYW5kbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ldmVudHMuUmVmc0NoYW5nZWRMaXN0ZW5lcjsKQEAgLTEyNyw2ICsxMjksNyBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAKIAkJZGlza1JlcG8gPSBmaWxlUmVwbzsKKwkJYWRkUmVwb1RvQ2xvc2UoZGlza1JlcG8pOwogCQlzZXRMb2dBbGxSZWZVcGRhdGVzKHRydWUpOwogCiAJCWlmICghdXNlUmVmdGFibGUpIHsKQEAgLTExOTAsNyArMTE5Myw4IEBAIHByaXZhdGUgdm9pZCBhc3NlcnRSZWZzKE9iamVjdC4uLiBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJTWFwPFN0cmluZywgUmVmPiByZWZzID0gZGlza1JlcG8uZ2V0UmVmRGF0YWJhc2UoKQotCQkJCS5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCk7CisJCQkJLmdldFJlZnNCeVByZWZpeChSZWZEYXRhYmFzZS5BTEwpLnN0cmVhbSgpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChSZWY6OmdldE5hbWUsIEZ1bmN0aW9uLmlkZW50aXR5KCkpKTsKIAkJUmVmIGFjdHVhbEhlYWQgPSByZWZzLnJlbW92ZShDb25zdGFudHMuSEVBRCk7CiAJCWlmIChhY3R1YWxIZWFkICE9IG51bGwpIHsKIAkJCVN0cmluZyBhY3R1YWxMZWFmTmFtZSA9IGFjdHVhbEhlYWQuZ2V0TGVhZigpLmdldE5hbWUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2tUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZWZ0YWJsZVN0YWNrVGVzdC5qYXZhCmluZGV4IDZjNzRmMDAuLjZjNzk5MjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFja1Rlc3QuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKQEAgLTMyLDEwICszMywxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TeXN0ZW1SZWFkZXI7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKKwogcHVibGljIGNsYXNzIEZpbGVSZWZ0YWJsZVN0YWNrVGVzdCB7CiAKIAlwcml2YXRlIHN0YXRpYyBSZWYgbmV3UmVmKFN0cmluZyBuYW1lLCBPYmplY3RJZCBpZCkgewpAQCAtMTE1LDkgKzExOCwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFjdGlvbjEwMjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGVzdENvbXBhY3Rpb24oMTAyNCk7CiAJfQogCi0JQFN1cHByZXNzV2FybmluZ3MoeyAicmVzb3VyY2UiLCAidW51c2VkIiB9KQorCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBtaXNzaW5nUmVmdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ2FuJ3QgZGVsZXRlIGluLXVzZSBmaWxlcyBvbiBXaW5kb3dzLgorCQlhc3N1bWVGYWxzZShTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5pc1dpbmRvd3MoKSk7CisKIAkJdHJ5IChGaWxlUmVmdGFibGVTdGFjayBzdGFjayA9IG5ldyBGaWxlUmVmdGFibGVTdGFjaygKIAkJCQluZXcgRmlsZShyZWZ0YWJsZURpciwgInJlZnMiKSwgcmVmdGFibGVEaXIsIG51bGwsCiAJCQkJKCkgLT4gbmV3IENvbmZpZygpKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeUJ1aWxkZXJBZnRlck9wZW5Db25maWdUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5QnVpbGRlckFmdGVyT3BlbkNvbmZpZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBiZDMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeUJ1aWxkZXJBZnRlck9wZW5Db25maWdUZXN0LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAyMyBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLgorICogYW5kIG90aGVyIGNvcHlyaWdodCBvd25lcnMgYXMgZG9jdW1lbnRlZCBpbiB0aGUgcHJvamVjdCdzIElQIGxvZy4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29yZUNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworCitwdWJsaWMgY2xhc3MgRmlsZVJlcG9zaXRvcnlCdWlsZGVyQWZ0ZXJPcGVuQ29uZmlnVGVzdCBleHRlbmRzIEZpbGVSZXBvc2l0b3J5QnVpbGRlclRlc3QgeworCS8qKiB7QGluaGVyaXREb2N9ICovCisJQEJlZm9yZQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnNldFVwKCk7CisJCVN0b3JlZENvbmZpZyB1c2VyQ29uZmlnID0gU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0VXNlckNvbmZpZygpOworCQl1c2VyQ29uZmlnLnNldEVudW0oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVFJVU1RfUEFDS0VEX1JFRlNfU1RBVCwKKwkJCQlDb3JlQ29uZmlnLlRydXN0UGFja2VkUmVmc1N0YXQuQUZURVJfT1BFTik7CisJCXVzZXJDb25maWcuc2F2ZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR2NUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY1Rlc3RDYXNlLmphdmEKaW5kZXggYmZiMjMzZi4uNDhmNmUwNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY1Rlc3RDYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY1Rlc3RDYXNlLmphdmEKQEAgLTQyLDYgKzQyLDcgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAT3ZlcnJpZGUKIAlAQWZ0ZXIKIAlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQl0ci5jbG9zZSgpOwogCQlzdXBlci50ZWFyRG93bigpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrV3JpdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrV3JpdGVyVGVzdC5qYXZhCmluZGV4IDFmZjIyNjQuLjNmZThmNTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1dyaXRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tXcml0ZXJUZXN0LmphdmEKQEAgLTcyMiw2ICs3MjIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFydGlhbFBhY2tGaWxlc1NjYW5XaGVuRG9pbmdTZWFyY2hGb3JSZXVzZVRpbWVvdXRDaGVjaygpCiAJICovCiAJcHJpdmF0ZSBGaWxlUmVwb3NpdG9yeSBzZXRVcFJlcG9XaXRoTXVsdGlwbGVQYWNrZmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJRmlsZVJlcG9zaXRvcnkgZmlsZVJlcG9zaXRvcnkgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShmaWxlUmVwb3NpdG9yeSk7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZmlsZVJlcG9zaXRvcnkpKSB7CiAJCQkvLyBDcmVhdGVzIDIgb2JqZWN0cyAoQzEgPSBjb21taXQsIFQxID0gdHJlZSkKIAkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJGaXJzdCBjb21taXQiKS5jYWxsKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeUFmdGVyT3BlbkNvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5QWZ0ZXJPcGVuQ29uZmlnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzA0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeUFmdGVyT3BlbkNvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDIzIFF1YWxjb21tIElubm92YXRpb24gQ2VudGVyLCBJbmMuCisgKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db3JlQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlN0b3JlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3lzdGVtUmVhZGVyOworCitwdWJsaWMgY2xhc3MgUmVmRGlyZWN0b3J5QWZ0ZXJPcGVuQ29uZmlnVGVzdCBleHRlbmRzIFJlZkRpcmVjdG9yeVRlc3QgeworCS8qKiB7QGluaGVyaXREb2N9ICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVmRGlyZWN0b3J5U2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RvcmVkQ29uZmlnIHVzZXJDb25maWcgPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRVc2VyQ29uZmlnKCk7CisJCXVzZXJDb25maWcuc2V0RW51bShDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKKwkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UUlVTVF9QQUNLRURfUkVGU19TVEFULAorCQkJCUNvcmVDb25maWcuVHJ1c3RQYWNrZWRSZWZzU3RhdC5BRlRFUl9PUEVOKTsKKwkJdXNlckNvbmZpZy5zYXZlKCk7CisJCXN1cGVyLnJlZkRpcmVjdG9yeVNldHVwKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVRlc3QuamF2YQppbmRleCAzOGM1NDVlLi40YjgwZjE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVRlc3QuamF2YQpAQCAtNzIsNyArNzIsMTAgQEAgcHVibGljIGNsYXNzIFJlZkRpcmVjdG9yeVRlc3QgZXh0ZW5kcyBMb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UgewogCUBCZWZvcmUKIAlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQlzdXBlci5zZXRVcCgpOworCQlyZWZEaXJlY3RvcnlTZXR1cCgpOworCX0KIAorCXB1YmxpYyB2b2lkIHJlZkRpcmVjdG9yeVNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWRpc2tSZXBvID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKIAkJcmVmZGlyID0gKFJlZkRpcmVjdG9yeSkgZGlza1JlcG8uZ2V0UmVmRGF0YWJhc2UoKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvaW8vQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9pby9DYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWE3YzBiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvaW8vQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjIsIFRlbmNlbnQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW8uQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0uQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Qcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk51bGxPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbVRlc3QgeworCXByaXZhdGUgc3RhdGljIGNsYXNzIENhbmNlbGxlZFRlc3RNb25pdG9yIGltcGxlbWVudHMgUHJvZ3Jlc3NNb25pdG9yIHsKKworCQlwcml2YXRlIGJvb2xlYW4gY2FuY2VsbGVkID0gZmFsc2U7CisKKwkJcHVibGljIHZvaWQgc2V0Q2FuY2VsbGVkKGJvb2xlYW4gY2FuY2VsbGVkKSB7CisJCQl0aGlzLmNhbmNlbGxlZCA9IGNhbmNlbGxlZDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBzdGFydChpbnQgdG90YWxUYXNrcykgeworCQkJLy8gbm90IGltcGxlbWVudGVkCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyB0aXRsZSwgaW50IHRvdGFsV29yaykgeworCQkJLy8gbm90IGltcGxlbWVudGVkCisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgdXBkYXRlKGludCBjb21wbGV0ZWQpIHsKKwkJCS8vIG5vdCBpbXBsZW1lbnRlZAorCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIGVuZFRhc2soKSB7CisJCQkvLyBub3QgaW1wbGVtZW50ZWQKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKKwkJCXJldHVybiBjYW5jZWxsZWQ7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDYW5jZWxJblByb2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ2FuY2VsbGVkVGVzdE1vbml0b3IgbSA9IG5ldyBDYW5jZWxsZWRUZXN0TW9uaXRvcigpOworCQl0cnkgKENhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbSgKKwkJCQltLCBOdWxsT3V0cHV0U3RyZWFtLklOU1RBTkNFKSkgeworCQkJYnl0ZVtdIEtCID0gbmV3IGJ5dGVbMTAyNF07CisJCQlpbnQgdHJpZ2dlckNhbmNlbFdyaXRlQ250ID0gQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSworCQkJCQkvIEtCLmxlbmd0aDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHJpZ2dlckNhbmNlbFdyaXRlQ250ICsgMTsgaSsrKSB7CisJCQkJb3V0LndyaXRlKEtCKTsKKwkJCX0KKwkJCWFzc2VydFRydWUob3V0Lmxlbmd0aCgpID4gQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyk7CisJCQltLnNldENhbmNlbGxlZCh0cnVlKTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmlnZ2VyQ2FuY2VsV3JpdGVDbnQgLSAxOyBpKyspIHsKKwkJCQlvdXQud3JpdGUoS0IpOworCQkJfQorCisJCQlsb25nIGxhc3RMZW5ndGggPSBvdXQubGVuZ3RoKCk7CisJCQlhc3NlcnRUaHJvd3MoSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbi5jbGFzcywgKCkgLT4geworCQkJCW91dC53cml0ZSgxKTsKKwkJCX0pOworCQkJYXNzZXJ0RXF1YWxzKGxhc3RMZW5ndGgsIG91dC5sZW5ndGgoKSk7CisKKwkJCWFzc2VydFRocm93cyhJbnRlcnJ1cHRlZElPRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisJCQkJb3V0LndyaXRlKG5ldyBieXRlWzFdKTsKKwkJCX0pOworCQkJYXNzZXJ0RXF1YWxzKGxhc3RMZW5ndGgsIG91dC5sZW5ndGgoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RUcmlnZ2VyQ2hlY2tBZnRlclNpbmdsZUJ5dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUNhbmNlbGxlZFRlc3RNb25pdG9yIG0gPSBuZXcgQ2FuY2VsbGVkVGVzdE1vbml0b3IoKTsKKwkJdHJ5IChDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0oCisJCQkJbSwgTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSkpIHsKKworCQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyArIDFdOworCQkJbS5zZXRDYW5jZWxsZWQodHJ1ZSk7CisKKwkJCWFzc2VydFRocm93cyhJbnRlcnJ1cHRlZElPRXhjZXB0aW9uLmNsYXNzLCAoKSAtPiB7CisJCQkJb3V0LndyaXRlKGJ5dGVzKTsKKwkJCX0pOworCQkJYXNzZXJ0RXF1YWxzKEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0ssIG91dC5sZW5ndGgoKSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlVGVzdC5qYXZhCmluZGV4IDExNzQxYjQuLmQwNjUyODAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC90cmFuc3BvcnQvc3NoL09wZW5Tc2hDb25maWdGaWxlVGVzdC5qYXZhCkBAIC0zNjksMjAgKzM2OSwyMSBAQCBwdWJsaWMgdm9pZCB0ZXN0SG9zdENhc2VJbnNlbnNpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TGlzdFZhbHVlU2luZ2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbmZpZygiSG9zdCBvcmN6XG5Vc2VyS25vd25Ib3N0c0ZpbGUgL2Zvby9iYXJcbiIpOworCQljb25maWcoIkhvc3Qgb3JjelxuVXNlcktub3duSG9zdHNGaWxlIH4vZm9vL2JhclxuIik7CiAJCWZpbmFsIEhvc3RDb25maWcgYyA9IGxvb2t1cCgib3JjeiIpOwogCQlhc3NlcnROb3ROdWxsKGMpOwotCQlhc3NlcnRFcXVhbHMoIi9mb28vYmFyIiwgYy5nZXRWYWx1ZSgiVXNlcktub3duSG9zdHNGaWxlIikpOworCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKS5nZXRQYXRoKCksCisJCQkJYy5nZXRWYWx1ZSgiVXNlcktub3duSG9zdHNGaWxlIikpOwogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdExpc3RWYWx1ZU11bHRpcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRpbGRlIGV4cGFuc2lvbiBvY2N1cnMgd2l0aGluIHRoZSBwYXJzZXIKLQkJY29uZmlnKCJIb3N0IG9yY3pcblVzZXJLbm93bkhvc3RzRmlsZSBcIn4vZm9vL2JhIHpcIiAvZm9vL2JhciBcbiIpOworCQljb25maWcoIkhvc3Qgb3JjelxuVXNlcktub3duSG9zdHNGaWxlIFwifi9mb28vYmEgelwiIH4vZm9vL2JhciBcbiIpOwogCQlmaW5hbCBIb3N0Q29uZmlnIGMgPSBsb29rdXAoIm9yY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChjKTsKIAkJYXNzZXJ0QXJyYXlFcXVhbHMobmV3IE9iamVjdFtdIHsgbmV3IEZpbGUoaG9tZSwgImZvby9iYSB6IikuZ2V0UGF0aCgpLAotCQkJCSIvZm9vL2JhciIgfSwKKwkJCQluZXcgRmlsZShob21lLCAiZm9vL2JhciIpLmdldFBhdGgoKSB9LAogCQkJCWMuZ2V0VmFsdWVzKCJVc2VyS25vd25Ib3N0c0ZpbGUiKS50b0FycmF5KCkpOwogCX0KIApAQCAtNDAzLDIyICs0MDQsMjMgQEAgcHVibGljIHZvaWQgdGVzdFJlcGVhdGVkTG9va3Vwc1dpdGhNb2RpZmljYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdElkZW50aXR5RmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljb25maWcoIkhvc3Qgb3JjelxuSWRlbnRpdHlGaWxlIFwifi9mb28vYmEgelwiXG5JZGVudGl0eUZpbGUgL2Zvby9iYXIiKTsKKwkJY29uZmlnKCJIb3N0IG9yY3pcbklkZW50aXR5RmlsZSBcIn4vZm9vL2JhIHpcIlxuSWRlbnRpdHlGaWxlIH4vZm9vL2JhciIpOwogCQlmaW5hbCBIb3N0Q29uZmlnIGggPSBsb29rdXAoIm9yY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChoKTsKIAkJLy8gRG9lcyB0aWxkZSByZXBsYWNlbWVudAogCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgT2JqZWN0W10geyBuZXcgRmlsZShob21lLCAiZm9vL2JhIHoiKS5nZXRQYXRoKCksCi0JCQkJIi9mb28vYmFyIiB9LAorCQkJCW5ldyBGaWxlKGhvbWUsICJmb28vYmFyIikuZ2V0UGF0aCgpIH0sCiAJCQkJaC5nZXRWYWx1ZXMoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpLnRvQXJyYXkoKSk7CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlJZGVudGl0eUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29uZmlnKCJJZGVudGl0eUZpbGUgXCJ+L2Zvby9iYSB6XCJcbkhvc3Qgb3JjelxuSWRlbnRpdHlGaWxlIC9mb28vYmFyXG5IT1NUICpcbklkZW50aXR5RmlsZSAvZm9vL2JheiIpOworCQljb25maWcoIklkZW50aXR5RmlsZSBcIn4vZm9vL2JhIHpcIlxuSG9zdCBvcmN6XG5JZGVudGl0eUZpbGUgfi9mb28vYmFyXG5IT1NUICpcbklkZW50aXR5RmlsZSB+L2Zvby9iYXoiKTsKIAkJZmluYWwgSG9zdENvbmZpZyBoID0gbG9va3VwKCJvcmN6Iik7CiAJCWFzc2VydE5vdE51bGwoaCk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7IG5ldyBGaWxlKGhvbWUsICJmb28vYmEgeiIpLmdldFBhdGgoKSwKLQkJCQkiL2Zvby9iYXIiLCAiL2Zvby9iYXoiIH0sCisJCQkJbmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKS5nZXRQYXRoKCksCisJCQkJbmV3IEZpbGUoaG9tZSwgImZvby9iYXoiKS5nZXRQYXRoKCkgfSwKIAkJCQloLmdldFZhbHVlcyhTc2hDb25zdGFudHMuSURFTlRJVFlfRklMRSkudG9BcnJheSgpKTsKIAl9CiAKQEAgLTQzNCwyMyArNDM2LDIzIEBAIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGVkUGF0dGVybigpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybigpIHRocm93cyBFeGNlcHRpb24gewotCQljb25maWcoIkhvc3QgcmVwby5vci5jelxuSWRlbnRpdHlGaWxlIH4vZm9vL2JhclxuSE9TVCAqLm9yLmN6XG5JZGVudGl0eUZpbGUgL2Zvby9iYXoiKTsKKwkJY29uZmlnKCJIb3N0IHJlcG8ub3IuY3pcbklkZW50aXR5RmlsZSB+L2Zvby9iYXJcbkhPU1QgKi5vci5jelxuSWRlbnRpdHlGaWxlIH4vZm9vL2JheiIpOwogCQlmaW5hbCBIb3N0Q29uZmlnIGggPSBsb29rdXAoInJlcG8ub3IuY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChoKTsKIAkJYXNzZXJ0SWRlbnRpdHkobmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKSwgaCk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7IG5ldyBGaWxlKGhvbWUsICJmb28vYmFyIikuZ2V0UGF0aCgpLAotCQkJCSIvZm9vL2JheiIgfSwKKwkJCQluZXcgRmlsZShob21lLCAiZm9vL2JheiIpLmdldFBhdGgoKSB9LAogCQkJCWguZ2V0VmFsdWVzKFNzaENvbnN0YW50cy5JREVOVElUWV9GSUxFKS50b0FycmF5KCkpOwogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE11bHRpSG9zdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljb25maWcoIkhvc3Qgb3JjeiAqLm9yLmN6XG5JZGVudGl0eUZpbGUgfi9mb28vYmFyXG5IT1NUICoub3IuY3pcbklkZW50aXR5RmlsZSAvZm9vL2JheiIpOworCQljb25maWcoIkhvc3Qgb3JjeiAqLm9yLmN6XG5JZGVudGl0eUZpbGUgfi9mb28vYmFyXG5IT1NUICoub3IuY3pcbklkZW50aXR5RmlsZSB+L2Zvby9iYXoiKTsKIAkJZmluYWwgSG9zdENvbmZpZyBoMSA9IGxvb2t1cCgicmVwby5vci5jeiIpOwogCQlhc3NlcnROb3ROdWxsKGgxKTsKIAkJYXNzZXJ0SWRlbnRpdHkobmV3IEZpbGUoaG9tZSwgImZvby9iYXIiKSwgaDEpOwogCQlhc3NlcnRBcnJheUVxdWFscyhuZXcgT2JqZWN0W10geyBuZXcgRmlsZShob21lLCAiZm9vL2JhciIpLmdldFBhdGgoKSwKLQkJCQkiL2Zvby9iYXoiIH0sCisJCQkJbmV3IEZpbGUoaG9tZSwgImZvby9iYXoiKS5nZXRQYXRoKCkgfSwKIAkJCQloMS5nZXRWYWx1ZXMoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpLnRvQXJyYXkoKSk7CiAJCWZpbmFsIEhvc3RDb25maWcgaDIgPSBsb29rdXAoIm9yY3oiKTsKIAkJYXNzZXJ0Tm90TnVsbChoMik7CkBAIC01NDcsMTggKzU0OSwzNiBAQCBwdWJsaWMgdm9pZCB0ZXN0RW9sQ29tbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEVuVmFyU3Vic3RpdHV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbmZpZygiSG9zdCBvcmN6XG5JZGVudGl0eUZpbGUgL3RtcC8ke1RTVF9WQVJ9XG4iCi0JCQkJKyAiQ2VydGlmaWNhdGVGaWxlIC90bXAvJHt9L2Zvb1xuVXNlciAke1RTVF9WQVJ9XG5JZGVudGl0eUFnZW50IC90bXAvJHtUU1RfVkFSL2JhciIpOworCQljb25maWcoIkhvc3Qgb3JjelxuSWRlbnRpdHlGaWxlIH4vdG1wLyR7VFNUX1ZBUn1cbiIKKwkJCQkrICJDZXJ0aWZpY2F0ZUZpbGUgfi90bXAvJHt9L2Zvb1xuVXNlciAke1RTVF9WQVJ9XG5JZGVudGl0eUFnZW50IH4vdG1wLyR7VFNUX1ZBUi9iYXIiKTsKIAkJSG9zdENvbmZpZyBoID0gbG9va3VwKCJvcmN6Iik7CiAJCWFzc2VydE5vdE51bGwoaCk7Ci0JCWFzc2VydEVxdWFscygiL3RtcC9URVNUIiwKKwkJRmlsZSB0bXAgPSBuZXcgRmlsZShob21lLCAidG1wIik7CisJCWFzc2VydEVxdWFscyhuZXcgRmlsZSh0bXAsICJURVNUIikuZ2V0UGF0aCgpLAogCQkJCWguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpKTsKIAkJLy8gTm8gdmFyaWFibGUgbmFtZQotCQlhc3NlcnRFcXVhbHMoIi90bXAvJHt9L2ZvbyIsIGguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLkNFUlRJRklDQVRFX0ZJTEUpKTsKKwkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKG5ldyBGaWxlKHRtcCwgIiR7fSIpLCAiZm9vIikuZ2V0UGF0aCgpLAorCQkJCWguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLkNFUlRJRklDQVRFX0ZJTEUpKTsKIAkJLy8gVXNlciBkb2Vzbid0IGdldCBlbnYgdmFyIHN1YnN0aXR1dGlvbjoKIAkJYXNzZXJ0VXNlcigiJHtUU1RfVkFSfSIsIGgpOwogCQkvLyBVbnRlcm1pbmF0ZWQ6Ci0JCWFzc2VydEVxdWFscygiL3RtcC8ke1RTVF9WQVIvYmFyIiwKKwkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKG5ldyBGaWxlKHRtcCwgIiR7VFNUX1ZBUiIpLCAiYmFyIikuZ2V0UGF0aCgpLAorCQkJCWguZ2V0VmFsdWUoU3NoQ29uc3RhbnRzLklERU5USVRZX0FHRU5UKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlBZ2VudE5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY29uZmlnKCJIb3N0IG9yY3pcbklkZW50aXR5QWdlbnQgbm9uZVxuIik7CisJCUhvc3RDb25maWcgaCA9IGxvb2t1cCgib3JjeiIpOworCQlhc3NlcnRFcXVhbHMoU3NoQ29uc3RhbnRzLk5PTkUsCisJCQkJaC5nZXRWYWx1ZShTc2hDb25zdGFudHMuSURFTlRJVFlfQUdFTlQpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eUFnZW50U3NoQXV0aFNvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJY29uZmlnKCJIb3N0IG9yY3pcbklkZW50aXR5QWdlbnQgU1NIX0FVVEhfU09DS1xuIik7CisJCUhvc3RDb25maWcgaCA9IGxvb2t1cCgib3JjeiIpOworCQlhc3NlcnRFcXVhbHMoU3NoQ29uc3RhbnRzLkVOVl9TU0hfQVVUSF9TT0NLRVQsCiAJCQkJaC5nZXRWYWx1ZShTc2hDb25zdGFudHMuSURFTlRJVFlfQUdFTlQpKTsKIAl9CiAKQEAgLTYwNywxMyArNjI3LDE2IEBAIHB1YmxpYyB2b2lkIHRlc3ROb01hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZU1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbmZpZygiSG9zdCBmb28uYmFyXG5Qb3J0IDI5NDE4XG5JZGVudGl0eUZpbGUgL2Zvb1xuXG4iCi0JCQkJKyAiSG9zdCAqLmJhclxuUG9ydCAyMlxuSWRlbnRpdHlGaWxlIC9iYXJcbiIKLQkJCQkrICJIb3N0IGZvby5iYXJcblBvcnQgNDdcbklkZW50aXR5RmlsZSAvYmF6XG4iKTsKKwkJY29uZmlnKCJIb3N0IGZvby5iYXJcblBvcnQgMjk0MThcbklkZW50aXR5RmlsZSB+L2Zvb1xuXG4iCisJCQkJKyAiSG9zdCAqLmJhclxuUG9ydCAyMlxuSWRlbnRpdHlGaWxlIH4vYmFyXG4iCisJCQkJKyAiSG9zdCBmb28uYmFyXG5Qb3J0IDQ3XG5JZGVudGl0eUZpbGUgfi9iYXpcbiIpOwogCQlIb3N0Q29uZmlnIGggPSBsb29rdXAoImZvby5iYXIiKTsKIAkJYXNzZXJ0Tm90TnVsbChoKTsKIAkJYXNzZXJ0UG9ydCgyOTQxOCwgaCk7Ci0JCWFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXSB7ICIvZm9vIiwgIi9iYXIiLCAiL2JheiIgfSwKKwkJYXNzZXJ0QXJyYXlFcXVhbHMoCisJCQkJbmV3IE9iamVjdFtdIHsgbmV3IEZpbGUoaG9tZSwgImZvbyIpLmdldFBhdGgoKSwKKwkJCQkJCW5ldyBGaWxlKGhvbWUsICJiYXIiKS5nZXRQYXRoKCksCisJCQkJCQluZXcgRmlsZShob21lLCAiYmF6IikuZ2V0UGF0aCgpIH0sCiAJCQkJaC5nZXRWYWx1ZXMoU3NoQ29uc3RhbnRzLklERU5USVRZX0ZJTEUpLnRvQXJyYXkoKSk7CiAJfQogCkBAIC02MzMsNCArNjU2LDYxIEBAIHB1YmxpYyB2b2lkIHRlc3RXaGl0ZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydE5vdE51bGwoaCk7CiAJCWFzc2VydFBvcnQoMjIsIGgpOwogCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRpbWVTcGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMobnVsbCkpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIiKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIiAgIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCJzIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIgIHMiKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIiArcyIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiIC1zIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxbXMiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCI2MDAiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCI2MDBzIikpOworCQlhc3NlcnRFcXVhbHMoNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiICA2MDBzIikpOworCQlhc3NlcnRFcXVhbHMoNjAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiICA2MDBzICAiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCJcdDYwMHMiKSk7CisJCWFzc2VydEVxdWFscyg2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIgXHQ2MDAgICIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiICA2MDAgcyAgIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCI2MDAgcyIpKTsKKwkJYXNzZXJ0RXF1YWxzKDYwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjEwbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDU0MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaDMwbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDU0MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaCAzMG0iKSk7CisJCWFzc2VydEVxdWFscyg1NDAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMWggXHQzMG0iKSk7CisJCWFzc2VydEVxdWFscyg1NDAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMWgrMzBtIikpOworCQlhc3NlcnRFcXVhbHMoNTQwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFoICszMG0iKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFoICsgMzBtIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaCAtMzBtIikpOworCQlhc3NlcnRFcXVhbHMoMzYzMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFoMzBzIikpOworCQlhc3NlcnRFcXVhbHMoNTQwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjMwbSAxaCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDM2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIzMG0gMzBtIikpOworCQlhc3NlcnRFcXVhbHMoNjAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIzMCAzMCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIwIikpOworCQlhc3NlcnRFcXVhbHMoMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjEiKSk7CisJCWFzc2VydEVxdWFscygxLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMVMiKSk7CisJCWFzc2VydEVxdWFscygxLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMXMiKSk7CisJCWFzc2VydEVxdWFscyg2MCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFNIikpOworCQlhc3NlcnRFcXVhbHMoNjAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxbSIpKTsKKwkJYXNzZXJ0RXF1YWxzKDM2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxSCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDM2MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxaCIpKTsKKwkJYXNzZXJ0RXF1YWxzKDg2NDAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMUQiKSk7CisJCWFzc2VydEVxdWFscyg4NjQwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjFkIikpOworCQlhc3NlcnRFcXVhbHMoNjA0ODAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMVciKSk7CisJCWFzc2VydEVxdWFscyg2MDQ4MDAsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCIxdyIpKTsKKwkJYXNzZXJ0RXF1YWxzKDE3MjgwMCwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjJkIikpOworCQlhc3NlcnRFcXVhbHMoNjA0ODAwLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMXciKSk7CisJCWFzc2VydEVxdWFscyg2MDQ4MDAgKyAxNzI4MDAgKyAzICogMzYwMCArIDMwICogNjAgKyAxMCwKKwkJCQlPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiMXcyZDNoMzBtMTBzIikpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlLnRpbWVTcGVjKCItNyIpKTsKKwkJYXNzZXJ0RXF1YWxzKC0xLCBPcGVuU3NoQ29uZmlnRmlsZS50aW1lU3BlYygiLTlkIikpOworCQlhc3NlcnRFcXVhbHMoSW50ZWdlci5NQVhfVkFMVUUsIE9wZW5Tc2hDb25maWdGaWxlCisJCQkJLnRpbWVTcGVjKEludGVnZXIudG9TdHJpbmcoSW50ZWdlci5NQVhfVkFMVUUpKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUKKwkJCQkudGltZVNwZWMoTG9uZy50b1N0cmluZyhJbnRlZ2VyLk1BWF9WQUxVRSArIDFMKSkpOworCQlhc3NlcnRFcXVhbHMoLTEsIE9wZW5Tc2hDb25maWdGaWxlCisJCQkJLnRpbWVTcGVjKEludGVnZXIudG9TdHJpbmcoSW50ZWdlci5NQVhfVkFMVUUgLyA2MCArIDEpICsgJ00nKSk7CisJCWFzc2VydEVxdWFscygtMSwgT3BlblNzaENvbmZpZ0ZpbGUudGltZVNwZWMoIjEwMDAwMDAwMDAwMDAwMDAwMDAwMDB3IikpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2Q29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BYmJyZXZDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhY2UwOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2Q29uZmlnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBNYXR0aGlhcyBTb2huIDxtYXR0aGlhcy5zb2huQHNhcC5jb20+IGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRocm93czsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZUJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgQWJicmV2Q29uZmlnVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscyg3LCB0ZXN0Q29yZUFiYnJldihudWxsKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QXV0bygpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoNywgdGVzdENvcmVBYmJyZXYoImF1dG8iKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Tm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzZXJ0RXF1YWxzKDQwLCB0ZXN0Q29yZUFiYnJldigibm8iKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzZXJ0RXF1YWxzKDQsIHRlc3RDb3JlQWJicmV2KCI0IikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygyMiwgdGVzdENvcmVBYmJyZXYoIjIyIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFZhbGlkTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscyg0MCwgdGVzdENvcmVBYmJyZXYoIjQwIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWQoKSB7CisJCWFzc2VydFRocm93cyhJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKKwkJCQkoKSAtPiB0ZXN0Q29yZUFiYnJldigiZm9vIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWQyKCkgeworCQlhc3NlcnRUaHJvd3MoSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MsCisJCQkJKCkgLT4gdGVzdENvcmVBYmJyZXYoIjJrIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWROZWdhdGl2ZSgpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCItMTAwMCIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQmVsb3dSYW5nZSgpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCIzIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEludmFsaWRCZWxvd1JhbmdlMigpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCItMSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWJvdmVSYW5nZSgpIHsKKwkJYXNzZXJ0VGhyb3dzKEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzLAorCQkJCSgpIC0+IHRlc3RDb3JlQWJicmV2KCI0MSIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWJvdmVSYW5nZTIoKSB7CisJCWFzc2VydFRocm93cyhJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKKwkJCQkoKSAtPiB0ZXN0Q29yZUFiYnJldigiMTAwMDAwIikpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nTm8oKQorCQkJdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygiNDAiLCBzZXRDb3JlQWJicmV2KCJubyIpLnRvU3RyaW5nKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkKKwkJCXRocm93cyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoIjciLCBzZXRDb3JlQWJicmV2KCJhdXRvIikudG9TdHJpbmcoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcxMigpCisJCQl0aHJvd3MgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJYXNzZXJ0RXF1YWxzKCIxMiIsIHNldENvcmVBYmJyZXYoIjEyIikudG9TdHJpbmcoKSk7CisJfQorCisJcHJpdmF0ZSBpbnQgdGVzdENvcmVBYmJyZXYoU3RyaW5nIHZhbHVlKQorCQkJdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBzZXRDb3JlQWJicmV2KHZhbHVlKS5nZXQoKTsKKwl9CisKKwlwcml2YXRlIEFiYnJldkNvbmZpZyBzZXRDb3JlQWJicmV2KFN0cmluZyB2YWx1ZSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24geworCQlGaWxlQmFzZWRDb25maWcgY29uZmlnID0gZGIuZ2V0Q29uZmlnKCk7CisJCWNvbmZpZy5zZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQUJCUkVWLCB2YWx1ZSk7CisJCWNvbmZpZy5zYXZlKCk7CisJCXJldHVybiBBYmJyZXZDb25maWcucGFyc2VGcm9tQ29uZmlnKGRiKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0Q29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1ZDc4MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0Q29uZmlnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaHJvd3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdENvbmZpZy5DbGVhbnVwTW9kZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIENvbW1pdENvbmZpZ1Rlc3QgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29tbWl0Q29uZmlnIGNmZyA9IHBhcnNlKCIiKTsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGNsZWFuLXVwIG1vZGUiLCBDbGVhbnVwTW9kZS5ERUZBVUxULAorCQkJCWNmZy5nZXRDbGVhbnVwTW9kZSgpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDb21taXRDbGVhbnVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIHZhbHVlcyA9IHsgInN0cmlwIiwgIndoaXRlc3BhY2UiLCAidmVyYmF0aW0iLCAic2Npc3NvcnMiLAorCQkJCSJkZWZhdWx0IiB9OworCQlDbGVhbnVwTW9kZVtdIGV4cGVjdGVkID0geyBDbGVhbnVwTW9kZS5TVFJJUCwgQ2xlYW51cE1vZGUuV0hJVEVTUEFDRSwKKwkJCQlDbGVhbnVwTW9kZS5WRVJCQVRJTSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsCisJCQkJQ2xlYW51cE1vZGUuREVGQVVMVCB9OworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJQ29tbWl0Q29uZmlnIGNmZyA9IHBhcnNlKCJbY29tbWl0XVxuXHRjbGVhbnVwID0gIiArIHZhbHVlc1tpXSk7CisJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY2xlYW4tdXAgbW9kZSIsIGV4cGVjdGVkW2ldLAorCQkJCQljZmcuZ2V0Q2xlYW51cE1vZGUoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIHZhbHVlcyA9IHsgInN0cmlwIiwgIndoaXRlc3BhY2UiLCAidmVyYmF0aW0iLCAic2Npc3NvcnMiLAorCQkJCSJkZWZhdWx0IiB9OworCQlDbGVhbnVwTW9kZVtdIGV4cGVjdGVkID0geyBDbGVhbnVwTW9kZS5TVFJJUCwgQ2xlYW51cE1vZGUuV0hJVEVTUEFDRSwKKwkJCQlDbGVhbnVwTW9kZS5WRVJCQVRJTSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsCisJCQkJQ2xlYW51cE1vZGUuREVGQVVMVCB9OworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJQ29tbWl0Q29uZmlnIGNmZyA9IHBhcnNlKCJbY29tbWl0XVxuXHRjbGVhbnVwID0gIiArIHZhbHVlc1tpXSk7CisJCQlmb3IgKENsZWFudXBNb2RlIG1vZGUgOiBDbGVhbnVwTW9kZS52YWx1ZXMoKSkgeworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQkJCUNsZWFudXBNb2RlIHJlc29sdmVkID0gY2ZnLnJlc29sdmUobW9kZSwgaiA9PSAwKTsKKwkJCQkJaWYgKG1vZGUgIT0gQ2xlYW51cE1vZGUuREVGQVVMVCkgeworCQkJCQkJYXNzZXJ0RXF1YWxzKCJDbGVhbi11cCBtb2RlIHNob3VsZCBiZSB1bmNoYW5nZWQiLCBtb2RlLAorCQkJCQkJCQlyZXNvbHZlZCk7CisJCQkJCX0gZWxzZSBpZiAoaSArIDEgPCB2YWx1ZXMubGVuZ3RoKSB7CisJCQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY2xlYW4tdXAgbW9kZSIsIGV4cGVjdGVkW2ldLAorCQkJCQkJCQlyZXNvbHZlZCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY2xlYW4tdXAgbW9kZSIsCisJCQkJCQkJCWogPT0gMCA/IENsZWFudXBNb2RlLlNUUklQCisJCQkJCQkJCQkJOiBDbGVhbnVwTW9kZS5XSElURVNQQUNFLAorCQkJCQkJCQlyZXNvbHZlZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhbkRlZmF1bHRUaHJvd3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJYXNzZXJ0VGhyb3dzKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcywgKCkgLT4gQ29tbWl0Q29uZmlnCisJCQkJLmNsZWFuVGV4dCgiV2hhdGV2ZXIiLCBDbGVhbnVwTW9kZS5ERUZBVUxULCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblZlcmJhdGltKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlxuICBcbldoYXRldmVyICBcblxuXG4jIEEgY29tbWVudFxuXG5Nb3JlXHQgXG5cblxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwgbWVzc2FnZSwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlZFUkJBVElNLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhbldoaXRlc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgQSBjb21tZW50XG5cbk1vcmVcdCBcblxuXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLAorCQkJCSJXaGF0ZXZlclxuXG4jIEEgY29tbWVudFxuXG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuV0hJVEVTUEFDRSwgJyMnKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2xlYW5TdHJpcCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgbWVzc2FnZSA9ICJcbiAgXG5XaGF0ZXZlciAgXG5cblxuIyBBIGNvbW1lbnRcblxuTW9yZVx0IFxuXG5cbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsICJXaGF0ZXZlclxuXG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU1RSSVAsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU3RyaXBDdXN0b21DaGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlxuICBcbldoYXRldmVyICBcblxuXG4jIE5vdCBhIGNvbW1lbnRcblxuICAgPEEgY29tbWVudFxuTW9yZVx0IFxuXG5cbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsCisJCQkJIldoYXRldmVyXG5cbiMgTm90IGEgY29tbWVudFxuXG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU1RSSVAsICc8JykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU2Npc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgTm90IGEgY29tbWVudFxuXG4gICA8QSBjb21tZW50XG5Nb3JlXHQgXG5cblxuIgorCQkJCSsgIiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tID44IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCQkJCSsgIk1vcmVcbk1vcmVcbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsCisJCQkJIldoYXRldmVyXG5cbiMgTm90IGEgY29tbWVudFxuXG4gICA8QSBjb21tZW50XG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU2Npc3NvcnNDdXN0b21DaGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlxuICBcbldoYXRldmVyICBcblxuXG4jIE5vdCBhIGNvbW1lbnRcblxuICAgPEEgY29tbWVudFxuTW9yZVx0IFxuXG5cbiIKKwkJCQkrICI8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA+OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkJCQkrICJNb3JlXG5Nb3JlXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLAorCQkJCSJXaGF0ZXZlclxuXG4jIE5vdCBhIGNvbW1lbnRcblxuICAgPEEgY29tbWVudFxuTW9yZVxuIiwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNDSVNTT1JTLCAnPCcpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzQXRUb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCQkJKyAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgTm90IGEgY29tbWVudFxuXG4gICA8QSBjb21tZW50XG5Nb3JlXHQgXG5cblxuIgorCQkJCSsgIk1vcmVcbk1vcmVcbiI7CisJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNoYW5nZSIsICIiLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU2Npc3NvcnNOb1NjaXNzb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiXG4gIFxuV2hhdGV2ZXIgIFxuXG5cbiMgQSBjb21tZW50XG5cbk1vcmVcdCBcblxuXG4iOworCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbWVzc2FnZSBjaGFuZ2UiLAorCQkJCSJXaGF0ZXZlclxuXG4jIEEgY29tbWVudFxuXG5Nb3JlXG4iLAorCQkJCUNvbW1pdENvbmZpZy5jbGVhblRleHQobWVzc2FnZSwgQ2xlYW51cE1vZGUuU0NJU1NPUlMsICcjJykpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENsZWFuU2Npc3NvcnNOb1NjaXNzb3IyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBtZXNzYWdlID0gIlRleHRcbiIKKwkJCQkrICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCQkJKyAiTW9yZVxuTW9yZVxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwgbWVzc2FnZSwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNDSVNTT1JTLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzTm9TY2lzc29yMygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgbWVzc2FnZSA9ICJUZXh0XG4iCisJCQkJLy8gV3JvbmcgbnVtYmVyIG9mIGRhc2hlcworCQkJCSsgIiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCQkJKyAiTW9yZVxuTW9yZVxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwgbWVzc2FnZSwKKwkJCQlDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIENsZWFudXBNb2RlLlNDSVNTT1JTLCAnIycpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDbGVhblNjaXNzb3JzQXRFbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSAiVGV4dFxuIgorCQkJCSsgIiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tID44IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKwkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY2hhbmdlIiwgIlRleHRcbiIsCisJCQkJQ29tbWl0Q29uZmlnLmNsZWFuVGV4dChtZXNzYWdlLCBDbGVhbnVwTW9kZS5TQ0lTU09SUywgJyMnKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQ29tbWl0Q29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50KQorCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24geworCQlDb25maWcgYyA9IG5ldyBDb25maWcoKTsKKwkJYy5mcm9tVGV4dChjb250ZW50KTsKKwkJcmV0dXJuIGMuZ2V0KENvbW1pdENvbmZpZy5LRVkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRUZW1wbGF0ZUNvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0VGVtcGxhdGVDb25maWdUZXN0LmphdmEKaW5kZXggNmRiZTMwYS4uNDJiYWZiNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRUZW1wbGF0ZUNvbmZpZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdFRlbXBsYXRlQ29uZmlnVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBTQVAgU0UgYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDIxLCAyMDIyIFNBUCBTRSBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC00Nyw4ICs0Nyw3IEBAIHB1YmxpYyB2b2lkIHRlc3RDb21taXRUZW1wbGF0ZVBhdGhJbkhvbWVEaXJlY29yeSgpCiAJCQkJIi50bXAiLCBuZXcgRmlsZShob21lRGlyKSk7CiAJCXRlbXBGaWxlSW5Ib21lRGlyZWN0b3J5LmRlbGV0ZU9uRXhpdCgpOwogCQlKR2l0VGVzdFV0aWwud3JpdGUodGVtcEZpbGVJbkhvbWVEaXJlY3RvcnksIHRlbXBsYXRlQ29udGVudCk7Ci0JCVN0cmluZyBleHBlY3RlZFRlbXBsYXRlUGF0aCA9IHRlbXBGaWxlSW5Ib21lRGlyZWN0b3J5LmdldFBhdGgoKQotCQkJCS5yZXBsYWNlKGhvbWVEaXIsICJ+Iik7CisJCVN0cmluZyBleHBlY3RlZFRlbXBsYXRlUGF0aCA9ICJ+LyIgKyB0ZW1wRmlsZUluSG9tZURpcmVjdG9yeS5nZXROYW1lKCk7CiAJCWNvbmZpZyA9IENvbmZpZ1Rlc3QKIAkJCQkucGFyc2UoIltjb21taXRdXG5cdHRlbXBsYXRlID0gIiArIGV4cGVjdGVkVGVtcGxhdGVQYXRoICsgIlxuIik7CiAJCVN0cmluZyB0ZW1wbGF0ZVBhdGggPSBjb25maWcuZ2V0KENvbW1pdENvbmZpZy5LRVkpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCmluZGV4IDliODJjMmEuLmE4NWE0ZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhCkBAIC0xNDg4LDcgKzE0ODgsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0Q29tbWl0VGVtcGxhdGVDb25maWcoKQogCQlTdHJpbmcgZXhwZWN0ZWRUZW1wbGF0ZVBhdGggPSB0ZW1wRmlsZS5nZXRQYXRoKCk7CiAKIAkJQ29uZmlnIGNvbmZpZyA9IHBhcnNlKAotCQkJCSJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyBleHBlY3RlZFRlbXBsYXRlUGF0aCArICJcbiIpOworCQkJCSJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIKKwkJCQkJCSsgQ29uZmlnLmVzY2FwZVZhbHVlKGV4cGVjdGVkVGVtcGxhdGVQYXRoKSArICJcbiIpOwogCiAJCVN0cmluZyB0ZW1wbGF0ZVBhdGggPSBjb25maWcuZ2V0KENvbW1pdENvbmZpZy5LRVkpCiAJCQkJLmdldENvbW1pdFRlbXBsYXRlUGF0aCgpOwpAQCAtMTUzNyw3ICsxNTM4LDggQEAgcHVibGljIHZvaWQgdGVzdENvbW1pdFRlbXBsYXRlRW5jb2RpbmcoKQogCQlKR2l0VGVzdFV0aWwud3JpdGUodGVtcEZpbGUsIHRlbXBsYXRlQ29udGVudCk7CiAJCVN0cmluZyBleHBlY3RlZFRlbXBsYXRlUGF0aCA9IHRlbXBGaWxlLmdldFBhdGgoKTsKIAkJY29uZmlnID0gcGFyc2UoIltpMThuXVxuXHRjb21taXRFbmNvZGluZyA9IHV0Zi04XG4iCi0JCQkJKyAiW2NvbW1pdF1cblx0dGVtcGxhdGUgPSAiICsgZXhwZWN0ZWRUZW1wbGF0ZVBhdGggKyAiXG4iKTsKKwkJCQkrICJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIKKwkJCQkrIENvbmZpZy5lc2NhcGVWYWx1ZShleHBlY3RlZFRlbXBsYXRlUGF0aCkgKyAiXG4iKTsKIAkJYXNzZXJ0RXF1YWxzKHRlbXBsYXRlQ29udGVudCwKIAkJCQljb25maWcuZ2V0KENvbW1pdENvbmZpZy5LRVkpLmdldENvbW1pdFRlbXBsYXRlQ29udGVudChyZXBvKSk7CiAJCVN0cmluZyBjb21taXRFbmNvZGluZyA9IGNvbmZpZy5nZXQoQ29tbWl0Q29uZmlnLktFWSkKQEAgLTE1NTYsNyArMTU1OCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RDb21taXRUZW1wbGF0ZVdpdGhJbnZhbGlkRW5jb2RpbmcoKQogCQlTdHJpbmcgdGVtcGxhdGVDb250ZW50ID0gImNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlIjsKIAkJSkdpdFRlc3RVdGlsLndyaXRlKHRlbXBGaWxlLCB0ZW1wbGF0ZUNvbnRlbnQpOwogCQljb25maWcgPSBwYXJzZSgiW2kxOG5dXG5cdGNvbW1pdEVuY29kaW5nID0gaW52YWxpZEVjb2RpbmdcbiIKLQkJCQkrICJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyB0ZW1wRmlsZS5nZXRQYXRoKCkgKyAiXG4iKTsKKwkJCQkrICJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIKKwkJCQkrIENvbmZpZy5lc2NhcGVWYWx1ZSh0ZW1wRmlsZS5nZXRQYXRoKCkpICsgIlxuIik7CiAJCWNvbmZpZy5nZXQoQ29tbWl0Q29uZmlnLktFWSkuZ2V0Q29tbWl0VGVtcGxhdGVDb250ZW50KHJlcG8pOwogCX0KIApAQCAtMTU3MCw3ICsxNTczLDcgQEAgcHVibGljIHZvaWQgdGVzdENvbW1pdFRlbXBsYXRlV2l0aEludmFsaWRQYXRoKCkKIAkJU3RyaW5nIHRlbXBsYXRlQ29udGVudCA9ICJjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZSI7CiAJCUpHaXRUZXN0VXRpbC53cml0ZSh0ZW1wRmlsZSwgdGVtcGxhdGVDb250ZW50KTsKIAkJLy8gY29tbWl0IG1lc3NhZ2UgZW5jb2RpbmcKLQkJU3RyaW5nIGV4cGVjdGVkVGVtcGxhdGVQYXRoID0gIi9ub25FeGlzdGluZ1RlbXBsYXRlIjsKKwkJU3RyaW5nIGV4cGVjdGVkVGVtcGxhdGVQYXRoID0gIn4vbm9uRXhpc3RpbmdUZW1wbGF0ZSI7CiAJCWNvbmZpZyA9IHBhcnNlKCJbY29tbWl0XVxuXHR0ZW1wbGF0ZSA9ICIgKyBleHBlY3RlZFRlbXBsYXRlUGF0aCArICJcbiIpOwogCQlTdHJpbmcgdGVtcGxhdGVQYXRoID0gY29uZmlnLmdldChDb21taXRDb25maWcuS0VZKQogCQkJCS5nZXRDb21taXRUZW1wbGF0ZVBhdGgoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvRGlyQ2FjaGVDaGVja291dFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvRGlyQ2FjaGVDaGVja291dFRlc3QuamF2YQppbmRleCBhZjhhNThmLi4wZmFmY2Q2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0RpckNhY2hlQ2hlY2tvdXRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EaXJDYWNoZUNoZWNrb3V0VGVzdC5qYXZhCkBAIC0yLDcgKzIsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA3LCBEYXZlIFdhdHNvbiA8ZHdhdHNvbkBtaW12aXN0YS5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSwgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPgogICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEsIFJvYmluIFJvc2VuYmVyZyA8cm9iaW4ucm9zZW5iZXJnQGRld2lyZS5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMjAgQ2hyaXN0aWFuIEhhbHN0cmljayA8Y2hyaXN0aWFuLmhhbHN0cmlja0BzYXAuY29tPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMjIgQ2hyaXN0aWFuIEhhbHN0cmljayA8Y2hyaXN0aWFuLmhhbHN0cmlja0BzYXAuY29tPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0yNDIsNiArMjQyLDcgQEAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxDaGVja291dCgpIHRocm93cyBFeGNlcHRpb24gewogCQlMaXN0ZW5lckhhbmRsZSBoYW5kbGUgPSBudWxsOwogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKTsKIAkJCQlUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBkYl90ID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQloYW5kbGUgPSBkYi5nZXRMaXN0ZW5lckxpc3QoKQogCQkJCQkuYWRkV29ya2luZ1RyZWVNb2RpZmllZExpc3RlbmVyKHJlY29yZGVyKTsKIAkJCUJyYW5jaEJ1aWxkZXIgbWFzdGVyID0gZGJfdC5icmFuY2goIm1hc3RlciIpOwpAQCAtMjYxLDYgKzI2Miw3IEBAIHByaXZhdGUgdm9pZCBjaGVja291dExpbmVFbmRpbmdzKFN0cmluZyBpbkluZGV4LCBTdHJpbmcgZXhwZWN0ZWQsCiAJCQlTdHJpbmcgYXR0cmlidXRlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpOwogCQkJCVRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGRiX3QgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCUJyYW5jaEJ1aWxkZXIgbWFzdGVyID0gZGJfdC5icmFuY2goIm1hc3RlciIpOwogCQkJbWFzdGVyLmNvbW1pdCgpLmFkZCgiZiIsIGluSW5kZXgpLm1lc3NhZ2UoIm0wIikuY3JlYXRlKCk7CiAJCQlpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoYXR0cmlidXRlcykpIHsKQEAgLTMxMyw4ICszMTUsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRXaXRoTEYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0V2l0aExGQXV0bygpIHRocm93cyBFeGNlcHRpb24gewotCQljaGVja291dExpbmVFbmRpbmdzKCJmaXJzdCBsaW5lXG5zZWNvbmQgbGluZVxuIiwKLQkJCQkiZmlyc3QgbGluZVxuc2Vjb25kIGxpbmVcbiIsICJmIHRleHQ9YXV0byIpOworCQlTdHJpbmcgZXhwZWN0ZWQgPSBTdHJpbmcuZm9ybWF0KCJmaXJzdCBsaW5lJW5zZWNvbmQgbGluZSVuIik7CisJCWNoZWNrb3V0TGluZUVuZGluZ3MoImZpcnN0IGxpbmVcbnNlY29uZCBsaW5lXG4iLCBleHBlY3RlZCwKKwkJCQkiZiB0ZXh0PWF1dG8iKTsKIAl9CiAKIAlAVGVzdApAQCAtMzI1LDkgKzMyOCw5IEBAIHB1YmxpYyB2b2lkIHRlc3RDaGVja291dFdpdGhMRkF1dG9Fb2xMZigpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRXaXRoTEZBdXRvRW9sTmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBleHBlY3RlZCA9IFN0cmluZy5mb3JtYXQoImZpcnN0IGxpbmUlbnNlY29uZCBsaW5lJW4iKTsKIAkJY2hlY2tvdXRMaW5lRW5kaW5ncygKLQkJCQkiZmlyc3QgbGluZVxuc2Vjb25kIGxpbmVcbiIsICJmaXJzdCBsaW5lXG5zZWNvbmQgbGluZVxuIgotCQkJCQkJLnJlcGxhY2VBbGwoIlxuIiwgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSksCisJCQkJImZpcnN0IGxpbmVcbnNlY29uZCBsaW5lXG4iLCBleHBlY3RlZCwKIAkJCQkiZiB0ZXh0PWF1dG8gZW9sPW5hdGl2ZSIpOwogCX0KIApAQCAtMjA2NCw2ICsyMDY3LDcgQEAgcHVibGljIHZvaWQgdGVzdFJlc2V0V2l0aENoYW5nZUluR2l0aWdub3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0V2l0aEVtcHR5SW5kZXhEb2VzbnRPdmVyd3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYik7CiAJCQkJVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gZGJfdCA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KGRiKSkgeworCQkJZGIuaW5jcmVtZW50T3BlbigpOwogCQkJLy8gcHJlcGFyZSB0aGUgY29tbWl0cwogCQkJQnJhbmNoQnVpbGRlciBtYXN0ZXIgPSBkYl90LmJyYW5jaCgibWFzdGVyIik7CiAJCQlSZXZDb21taXQgbWVyZ2VDb21taXQgPSBtYXN0ZXIuY29tbWl0KCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvVDAwMDFfUGVyc29uSWRlbnRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50VGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvVDAwMDFfUGVyc29uSWRlbnRUZXN0LmphdmEKcmVuYW1lIHRvIG9yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnRUZXN0LmphdmEKaW5kZXggZTliYWI3Yy4uOTdkYTE3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UMDAwMV9QZXJzb25JZGVudFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50VGVzdC5qYXZhCkBAIC0xMywxMiArMTMsMTQgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IGphdmEudGltZS5JbnN0YW50OworaW1wb3J0IGphdmEudGltZS5ab25lSWQ7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLXB1YmxpYyBjbGFzcyBUMDAwMV9QZXJzb25JZGVudFRlc3QgeworcHVibGljIGNsYXNzIFBlcnNvbklkZW50VGVzdCB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QwMDFfTmV3SWRlbnQoKSB7CkBAIC00Miw2ICs0NCwzNCBAQCBwdWJsaWMgdm9pZCB0ZXN0MDAyX05ld0lkZW50KCkgewogCQkJCXAudG9FeHRlcm5hbFN0cmluZygpKTsKIAl9CiAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3ROZXdJZGVudEluc3RhbnQoKSB7CisJCVBlcnNvbklkZW50IHAgPSBuZXcgUGVyc29uSWRlbnQoIkEgVSBUaG9yIiwgImF1dGhvckBleGFtcGxlLmNvbSIsCisJCQkJSW5zdGFudC5vZkVwb2NoTWlsbGkoMTE0Mjg3ODUwMTAwMEwpLAorCQkJCVpvbmVJZC5vZigiQW1lcmljYS9OZXdfWW9yayIpKTsKKwkJYXNzZXJ0RXF1YWxzKCJBIFUgVGhvciIsIHAuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJhdXRob3JAZXhhbXBsZS5jb20iLCBwLmdldEVtYWlsQWRkcmVzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKEluc3RhbnQub2ZFcG9jaE1pbGxpKDExNDI4Nzg1MDEwMDBMKSwKKwkJCQlwLmdldFdoZW5Bc0luc3RhbnQoKSk7CisJCWFzc2VydEVxdWFscygiQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4gMTE0Mjg3ODUwMSAtMDUwMCIsCisJCQkJcC50b0V4dGVybmFsU3RyaW5nKCkpOworCQlhc3NlcnRFcXVhbHMoWm9uZUlkLm9mKCJHTVQtMDU6MDAiKSwgcC5nZXRab25lSWQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TmV3SWRlbnRJbnN0YW50MigpIHsKKwkJZmluYWwgUGVyc29uSWRlbnQgcCA9IG5ldyBQZXJzb25JZGVudCgiQSBVIFRob3IiLCAiYXV0aG9yQGV4YW1wbGUuY29tIiwKKwkJCQlJbnN0YW50Lm9mRXBvY2hNaWxsaSgxMTQyODc4NTAxMDAwTCksCisJCQkJWm9uZUlkLm9mKCJBc2lhL0tvbGthdGEiKSk7CisJCWFzc2VydEVxdWFscygiQSBVIFRob3IiLCBwLmdldE5hbWUoKSk7CisJCWFzc2VydEVxdWFscygiYXV0aG9yQGV4YW1wbGUuY29tIiwgcC5nZXRFbWFpbEFkZHJlc3MoKSk7CisJCWFzc2VydEVxdWFscyhJbnN0YW50Lm9mRXBvY2hNaWxsaSgxMTQyODc4NTAxMDAwTCksCisJCQkJcC5nZXRXaGVuQXNJbnN0YW50KCkpOworCQlhc3NlcnRFcXVhbHMoIkEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+IDExNDI4Nzg1MDEgKzA1MzAiLAorCQkJCXAudG9FeHRlcm5hbFN0cmluZygpKTsKKwkJYXNzZXJ0RXF1YWxzKFpvbmVJZC5vZigiR01UKzA1OjMwIiksIHAuZ2V0Wm9uZUlkKCkpOworCX0KKwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogCUBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQogCXB1YmxpYyB2b2lkIG51bGxGb3JOYW1lU2hvdWxkVGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlTWVzc2FnZUZvcm1hdHRlclRlc3QuamF2YQppbmRleCBkZWRiNTZjLi5hMjU3NmNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZU1lc3NhZ2VGb3JtYXR0ZXJUZXN0LmphdmEKQEAgLTEzLDYgKzEzLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkUmVmOwpAQCAtMTU3LDggKzE1OCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RJbnRvU3ltYm9saWNSZWZIZWFkUG9pbnRpbmdUb01hc3RlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNOb0Zvb3RlcigpIHsKIAkJU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSA9ICJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuIjsKIAkJU3RyaW5nIG1lc3NhZ2UgPSBmb3JtYXR0ZXIuZm9ybWF0V2l0aENvbmZsaWN0cyhvcmlnaW5hbE1lc3NhZ2UsCi0JCQkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAicGF0aDEiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKCJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuXG5Db25mbGljdHM6XG5cdHBhdGgxXG4iLAorCQkJCUxpc3Qub2YoInBhdGgxIiksICcjJyk7CisJCWFzc2VydEVxdWFscygiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHlcblxuIyBDb25mbGljdHM6XG4jXHRwYXRoMVxuIiwKIAkJCQltZXNzYWdlKTsKIAl9CiAKQEAgLTE2Niw4ICsxNjcsMTcgQEAgcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNOb0Zvb3RlcigpIHsKIAlwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0V2l0aENvbmZsaWN0c05vRm9vdGVyTm9MaW5lQnJlYWsoKSB7CiAJCVN0cmluZyBvcmlnaW5hbE1lc3NhZ2UgPSAiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHkiOwogCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwYXRoMSIgfSkpOwotCQlhc3NlcnRFcXVhbHMoIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5cbkNvbmZsaWN0czpcblx0cGF0aDFcbiIsCisJCQkJTGlzdC5vZigicGF0aDEiKSwgJyMnKTsKKwkJYXNzZXJ0RXF1YWxzKCJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuXG4jIENvbmZsaWN0czpcbiNcdHBhdGgxXG4iLAorCQkJCW1lc3NhZ2UpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNDdXN0b21DaGFyYWN0ZXIoKSB7CisJCVN0cmluZyBvcmlnaW5hbE1lc3NhZ2UgPSAiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHkiOworCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKKwkJCQlMaXN0Lm9mKCJwYXRoMSIpLCAnOycpOworCQlhc3NlcnRFcXVhbHMoIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5cbjsgQ29uZmxpY3RzOlxuO1x0cGF0aDFcbiIsCiAJCQkJbWVzc2FnZSk7CiAJfQogCkBAIC0xNzYsOSArMTg2LDkgQEAgcHVibGljIHZvaWQgdGVzdEZvcm1hdFdpdGhDb25mbGljdHNXaXRoRm9vdGVycygpIHsKIAkJU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSA9ICJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuXG5DaGFuZ2VJZDoiCiAJCQkJKyAiIEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iOwogCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwYXRoMSIgfSkpOworCQkJCUxpc3Qub2YoInBhdGgxIiksICcjJyk7CiAJCWFzc2VydEVxdWFscygKLQkJCQkiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHlcblxuQ29uZmxpY3RzOlxuXHRwYXRoMVxuXG4iCisJCQkJIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5cbiMgQ29uZmxpY3RzOlxuI1x0cGF0aDFcblxuIgogCQkJCQkJKyAiQ2hhbmdlSWQ6IEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iLAogCQkJCW1lc3NhZ2UpOwogCX0KQEAgLTE4OCw5ICsxOTgsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0V2l0aENvbmZsaWN0c1dpdGhGb290ZXJsaWtlTGluZUluQm9keSgpIHsKIAkJU3RyaW5nIG9yaWdpbmFsTWVzc2FnZSA9ICJIZWFkZXIgTGluZVxuXG5Db21taXQgYm9keVxuQnVnOjEyMzQ1Njdcbk1vcmUgQm9keVxuXG5DaGFuZ2VJZDoiCiAJCQkJKyAiIEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iOwogCQlTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXRXaXRoQ29uZmxpY3RzKG9yaWdpbmFsTWVzc2FnZSwKLQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwYXRoMSIgfSkpOworCQkJCUxpc3Qub2YoInBhdGgxIiksICcjJyk7CiAJCWFzc2VydEVxdWFscygKLQkJCQkiSGVhZGVyIExpbmVcblxuQ29tbWl0IGJvZHlcbkJ1ZzoxMjM0NTY3XG5Nb3JlIEJvZHlcblxuQ29uZmxpY3RzOlxuXHRwYXRoMVxuXG4iCisJCQkJIkhlYWRlciBMaW5lXG5cbkNvbW1pdCBib2R5XG5CdWc6MTIzNDU2N1xuTW9yZSBCb2R5XG5cbiMgQ29uZmxpY3RzOlxuI1x0cGF0aDFcblxuIgogCQkJCQkJKyAiQ2hhbmdlSWQ6IEkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODkxMjM0NTY3ODlcbkJ1ZzoxMjM0NTY3XG4iLAogCQkJCW1lc3NhZ2UpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyVGVzdC5qYXZhCmluZGV4IGRkODU3M2QuLmNiYWNhZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlclRlc3QuamF2YQpAQCAtMTgxMCw2ICsxODEwLDcgQEAgcHJpdmF0ZSB2b2lkIGNoZWNrTW9kaWZpY2F0aW9uVGltZVN0YW1wT3JkZXIoU3RyaW5nLi4uIHBhdGhlcykgewogCXByaXZhdGUgU3RyaW5nIHJlYWRCbG9iKE9iamVjdElkIHRyZWVpc2gsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTw/PiB0ciA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KGRiKTsKIAkJCQlSZXZXYWxrIHJ3ID0gdHIuZ2V0UmV2V2FsaygpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlSZXZUcmVlIHRyZWUgPSBydy5wYXJzZVRyZWUodHJlZWlzaCk7CiAJCQlSZXZPYmplY3Qgb2JqID0gdHIuZ2V0KHRyZWUsIHBhdGgpOwogCQkJaWYgKG9iaiA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVdhbGtUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVdhbGtUZXN0LmphdmEKaW5kZXggZWE5OTRmMC4uZjQ0NmQwNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVXYWxrVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlV2Fsa1Rlc3QuamF2YQpAQCAtMjE3LDcgKzIxNyw2IEBAIHB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCQkJYXNzZXJ0RXF1YWxzRmlsZShtb2R1bGVzR2l0RGlyLCBzdWJSZXBvLmdldERpcmVjdG9yeSgpKTsKIAkJCQlhc3NlcnRFcXVhbHNGaWxlKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksIHBhdGgpLAogCQkJCQkJc3ViUmVwby5nZXRXb3JrVHJlZSgpKTsKLQkJCQlzdWJSZXBvLmNsb3NlKCk7CiAJCQkJYXNzZXJ0RmFsc2UoZ2VuLm5leHQoKSk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlV3JpdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKaW5kZXggMDU0ZWI5Yy4uYmI2MmEwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKQEAgLTgwLDYgKzgwLDcgQEAgcHVibGljIHZvaWQgdGVzdFdyaXRlU2luZ2xlUmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRoZW4gd2UgY2xvbmUgYSBuZXcgcmVwbyBmcm9tIHRoYXQgYnVuZGxlIGFuZCBkbyBhIHNpbXBsZSB0ZXN0LiBUaGlzCiAJCS8vIG1ha2VzIHN1cmUgd2UgY291bGQgcmVhZCB0aGUgYnVuZGxlIHdlIGNyZWF0ZWQuCiAJCVJlcG9zaXRvcnkgbmV3UmVwbyA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCk7CisJCWFkZFJlcG9Ub0Nsb3NlKG5ld1JlcG8pOwogCQlGZXRjaFJlc3VsdCBmZXRjaFJlc3VsdCA9IGZldGNoRnJvbUJ1bmRsZShuZXdSZXBvLCBidW5kbGUpOwogCQlSZWYgYWR2ZXJ0aXNlZFJlZiA9IGZldGNoUmVzdWx0CiAJCQkJLmdldEFkdmVydGlzZWRSZWYoInJlZnMvaGVhZHMvZmlyc3Rjb21taXQiKTsKQEAgLTExNiw2ICsxMTcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50YWxCdW5kbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJLy8gbWFrZXMgc3VyZQogCQkvLyB3ZSBjb3VsZCByZWFkIHRoZSBidW5kbGUgd2UgY3JlYXRlZC4KIAkJUmVwb3NpdG9yeSBuZXdSZXBvID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UobmV3UmVwbyk7CiAJCUZldGNoUmVzdWx0IGZldGNoUmVzdWx0ID0gZmV0Y2hGcm9tQnVuZGxlKG5ld1JlcG8sIGJ1bmRsZSk7CiAJCVJlZiBhZHZlcnRpc2VkUmVmID0gZmV0Y2hSZXN1bHQuZ2V0QWR2ZXJ0aXNlZFJlZigicmVmcy9oZWFkcy9hYSIpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEKaW5kZXggNjBiODA5OC4uOTNiZWRiMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlclRlc3QuamF2YQpAQCAtMTEwLDYgKzExMCw3IEBAIHB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzICBJT0V4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdFRpbnlUaGluUGFjaygpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXZCbG9iIGE7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWEgPSBkLmJsb2IoImEiKTsKIAkJfQogCkBAIC0xMzIsNiArMTMzLDcgQEAgcHVibGljIHZvaWQgdGVzdFRpbnlUaGluUGFjaygpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RQYWNrV2l0aER1cGxpY2F0ZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGRhdGEgPSBDb25zdGFudHMuZW5jb2RlKCIwMTIzNDU2Nzg5YWJjZGVmZyIpOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWFzc2VydFRydWUoZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKS5oYXMoZC5ibG9iKGRhdGEpKSk7CiAJCX0KIApAQCAtMTUxLDYgKzE1Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYWNrV2l0aER1cGxpY2F0ZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0UGFja1dpdGhUcmFpbGluZ0dhcmJhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmV2QmxvYiBhOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlhID0gZC5ibG9iKCJhIik7CiAJCX0KIApAQCAtMTgwLDYgKzE4Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYWNrV2l0aFRyYWlsaW5nR2FyYmFnZSgpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RNYXhPYmplY3RTaXplRnVsbEJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGRhdGEgPSBDb25zdGFudHMuZW5jb2RlKCIwMTIzNDU2Nzg5Iik7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWQuYmxvYihkYXRhKTsKIAkJfQogCkBAIC0yMTMsNiArMjE3LDcgQEAgcHVibGljIHZvaWQgdGVzdE1heE9iamVjdFNpemVGdWxsQmxvYigpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RNYXhPYmplY3RTaXplRGVsdGFCbG9jaygpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXZCbG9iIGE7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWEgPSBkLmJsb2IoImEiKTsKIAkJfQogCkBAIC0yNDYsNiArMjUxLDcgQEAgcHVibGljIHZvaWQgdGVzdE1heE9iamVjdFNpemVEZWx0YUJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdE1heE9iamVjdFNpemVEZWx0YVJlc3VsdFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJUmV2QmxvYiBhOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlhID0gZC5ibG9iKCIwMTIzNDU2Nzg5Iik7CiAJCX0KIApAQCAtMjc4LDYgKzI4NCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RNYXhPYmplY3RTaXplRGVsdGFSZXN1bHRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdE5vbk1hcmtpbmdJbnB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXZCbG9iIGE7CiAJCXRyeSAoVGVzdFJlcG9zaXRvcnkgZCA9IG5ldyBUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PihkYikpIHsKKwkJCWRiLmluY3JlbWVudE9wZW4oKTsKIAkJCWEgPSBkLmJsb2IoImEiKTsKIAkJfQogCkBAIC0zMTgsNiArMzI1LDcgQEAgcHVibGljIHZvaWQgbWFyayhpbnQgbWF4bGVuZ3RoKSB7CiAJcHVibGljIHZvaWQgdGVzdERhdGFBZnRlclBhY2tGb290ZXJTaW5nbGVSZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCVJldkJsb2IgYTsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeSBkID0gbmV3IFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+KGRiKSkgeworCQkJZGIuaW5jcmVtZW50T3BlbigpOwogCQkJYSA9IGQuYmxvYigiYSIpOwogCQl9CiAKQEAgLTM3OSw2ICszODcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RGF0YUFmdGVyUGFja0Zvb3RlclNwbGl0SGVhZGVyUmVhZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gZGF0YSA9IENvbnN0YW50cy5lbmNvZGUoImEiKTsKIAkJUmV2QmxvYiBiOwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4oZGIpKSB7CisJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQliID0gZC5ibG9iKGRhdGEpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZ1Rlc3QuamF2YQppbmRleCA2MTA5ZDZjLi5jYmMxZDU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29uZmlnVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNywgRGF2aWQgUHVyc2Vob3VzZSA8ZGF2aWQucHVyc2Vob3VzZUBnbWFpbC5jb20+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxNywgMjAyMiBEYXZpZCBQdXJzZWhvdXNlIDxkYXZpZC5wdXJzZWhvdXNlQGdtYWlsLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsMTAgKzE0LDEzIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoQ29uZmlnLlB1c2hEZWZhdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hDb25maWcuUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIFB1c2hDb25maWdUZXN0IHsKKwogCUBUZXN0CiAJcHVibGljIHZvaWQgcHVzaFJlY3Vyc2VTdWJtb2R1bGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRUcnVlKFB1c2hSZWN1cnNlU3VibW9kdWxlc01vZGUuQ0hFQ0subWF0Y2hDb25maWdWYWx1ZSgiY2hlY2siKSk7CkBAIC01Miw0ICs1NSw1OSBAQCBwdWJsaWMgdm9pZCBwdXNoUmVjdXJzZVN1Ym1vZHVsZVRvQ29uZmlnVmFsdWUoKSB7CiAJCWFzc2VydEVxdWFscygiY2hlY2siLCBQdXNoUmVjdXJzZVN1Ym1vZHVsZXNNb2RlLkNIRUNLLnRvQ29uZmlnVmFsdWUoKSk7CiAJCWFzc2VydEVxdWFscygiZmFsc2UiLCBQdXNoUmVjdXJzZVN1Ym1vZHVsZXNNb2RlLk5PLnRvQ29uZmlnVmFsdWUoKSk7CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBwdXNoRGVmYXVsdE1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydFRydWUoUHVzaERlZmF1bHQuTk9USElORy5tYXRjaENvbmZpZ1ZhbHVlKCJub3RoaW5nIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0Lk5PVEhJTkcubWF0Y2hDb25maWdWYWx1ZSgiTk9USElORyIpKTsKKwkJYXNzZXJ0VHJ1ZShQdXNoRGVmYXVsdC5DVVJSRU5ULm1hdGNoQ29uZmlnVmFsdWUoImN1cnJlbnQiKSk7CisJCWFzc2VydFRydWUoUHVzaERlZmF1bHQuQ1VSUkVOVC5tYXRjaENvbmZpZ1ZhbHVlKCJDVVJSRU5UIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoInVwc3RyZWFtIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoIlVQU1RSRUFNIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoInRyYWNraW5nIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlVQU1RSRUFNLm1hdGNoQ29uZmlnVmFsdWUoIlRSQUNLSU5HIikpOworCQlhc3NlcnRUcnVlKFB1c2hEZWZhdWx0LlNJTVBMRS5tYXRjaENvbmZpZ1ZhbHVlKCJzaW1wbGUiKSk7CisJCWFzc2VydFRydWUoUHVzaERlZmF1bHQuU0lNUExFLm1hdGNoQ29uZmlnVmFsdWUoIlNJTVBMRSIpKTsKKwkJYXNzZXJ0VHJ1ZShQdXNoRGVmYXVsdC5NQVRDSElORy5tYXRjaENvbmZpZ1ZhbHVlKCJtYXRjaGluZyIpKTsKKwkJYXNzZXJ0VHJ1ZShQdXNoRGVmYXVsdC5NQVRDSElORy5tYXRjaENvbmZpZ1ZhbHVlKCJNQVRDSElORyIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1c2hEZWZhdWx0Tm9NYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRGYWxzZShQdXNoRGVmYXVsdC5OT1RISU5HLm1hdGNoQ29uZmlnVmFsdWUoIm4iKSk7CisJCWFzc2VydEZhbHNlKFB1c2hEZWZhdWx0LkNVUlJFTlQubWF0Y2hDb25maWdWYWx1ZSgiIikpOworCQlhc3NlcnRGYWxzZShQdXNoRGVmYXVsdC5VUFNUUkVBTS5tYXRjaENvbmZpZ1ZhbHVlKCJ0cmFjayIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHB1c2hEZWZhdWx0VG9Db25maWdWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmciLCBQdXNoRGVmYXVsdC5OT1RISU5HLnRvQ29uZmlnVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygiY3VycmVudCIsIFB1c2hEZWZhdWx0LkNVUlJFTlQudG9Db25maWdWYWx1ZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJ1cHN0cmVhbSIsIFB1c2hEZWZhdWx0LlVQU1RSRUFNLnRvQ29uZmlnVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygic2ltcGxlIiwgUHVzaERlZmF1bHQuU0lNUExFLnRvQ29uZmlnVmFsdWUoKSk7CisJCWFzc2VydEVxdWFscygibWF0Y2hpbmciLCBQdXNoRGVmYXVsdC5NQVRDSElORy50b0NvbmZpZ1ZhbHVlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEVtcHR5Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVB1c2hDb25maWcgY2ZnID0gcGFyc2UoIiIpOworCQlhc3NlcnRFcXVhbHMoUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZS5OTywgY2ZnLmdldFJlY3Vyc2VTdWJtb2R1bGVzKCkpOworCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuU0lNUExFLCBjZmcuZ2V0UHVzaERlZmF1bHQoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVB1c2hDb25maWcgY2ZnID0gcGFyc2UoCisJCQkJIltwdXNoXVxuXHRkZWZhdWx0ID0gdHJhY2tpbmdcblx0cmVjdXJzZVN1Ym1vZHVsZXMgPSBvbi1kZW1hbmRcbiIpOworCQlhc3NlcnRFcXVhbHMoUHVzaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZS5PTl9ERU1BTkQsCisJCQkJY2ZnLmdldFJlY3Vyc2VTdWJtb2R1bGVzKCkpOworCQlhc3NlcnRFcXVhbHMoUHVzaERlZmF1bHQuVVBTVFJFQU0sIGNmZy5nZXRQdXNoRGVmYXVsdCgpKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBQdXNoQ29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGMgPSBuZXcgQ29uZmlnKCk7CisJCWMuZnJvbVRleHQoY29udGVudCk7CisJCXJldHVybiBjLmdldChQdXNoQ29uZmlnOjpuZXcpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3NUZXN0LmphdmEKaW5kZXggNjkyODg1OS4uMmU4YjMwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzVGVzdC5qYXZhCkBAIC0xNCwxNCArMTQsMTkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaG9va3MuUHJlUHVzaEhvb2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWRSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOwpAQCAtMzEsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlRleHRQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50ZXN0LnJlc291cmNlcy5TYW1wbGVEYXRhUmVwb3NpdG9yeVRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlbW90ZVJlZlVwZGF0ZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk51bGxPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtMjIwLDcgKzIyNiwxNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5leHBlY3RlZFJlbW90ZVZzRm9yY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQkJLmZyb21TdHJpbmcoIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEiKSk7CiAJCWZpbmFsIFJlZiByZWYgPSBuZXcgT2JqZWN0SWRSZWYuVW5wZWVsZWQoUmVmLlN0b3JhZ2UuTE9PU0UsICJyZWZzL2hlYWRzL21hc3RlciIsCiAJCQkJT2JqZWN0SWQuZnJvbVN0cmluZygiYWM3ZTdlNDRjMTg4NWVmYjQ3MmFkNTRhNzgzMjdkNjZiZmM0ZWNlZiIpKTsKLQkJdGVzdE9uZVVwZGF0ZVN0YXR1cyhycnUsIHJlZiwgU3RhdHVzLlJFSkVDVEVEX1JFTU9URV9DSEFOR0VELCBudWxsKTsKKwkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKGJ5dGVzLCB0cnVlLAorCQkJCQkJU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJCQkJUHJpbnRTdHJlYW0gZXJyID0gbmV3IFByaW50U3RyZWFtKE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpKSB7CisJCQlNb2NrUHJlUHVzaEhvb2sgaG9vayA9IG5ldyBNb2NrUHJlUHVzaEhvb2soZGIsIG91dCwgZXJyKTsKKwkJCXRlc3RPbmVVcGRhdGVTdGF0dXMocnJ1LCByZWYsIFN0YXR1cy5SRUpFQ1RFRF9SRU1PVEVfQ0hBTkdFRCwgbnVsbCwKKwkJCQkJaG9vayk7CisJCQlvdXQuZmx1c2goKTsKKwkJCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKGJ5dGVzLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKwkJCWFzc2VydEVxdWFscygiIiwgcmVzdWx0KTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMjU2LDEwICsyNzIsMjIgQEAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1peGVkQ2FzZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZWZVcGRhdGVzLmFkZChycnVPayk7CiAJCXJlZlVwZGF0ZXMuYWRkKHJydVJlamVjdCk7CiAJCWFkdmVydGlzZWRSZWZzLmFkZChyZWZUb0NoYW5nZSk7Ci0JCWV4ZWN1dGVQdXNoKCk7Ci0JCWFzc2VydEVxdWFscyhTdGF0dXMuT0ssIHJydU9rLmdldFN0YXR1cygpKTsKLQkJYXNzZXJ0VHJ1ZShycnVPay5pc0Zhc3RGb3J3YXJkKCkpOwotCQlhc3NlcnRFcXVhbHMoU3RhdHVzLk5PTl9FWElTVElORywgcnJ1UmVqZWN0LmdldFN0YXR1cygpKTsKKwkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQkJUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKGJ5dGVzLCB0cnVlLAorCQkJCQkJU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJCQkJUHJpbnRTdHJlYW0gZXJyID0gbmV3IFByaW50U3RyZWFtKE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpKSB7CisJCQlNb2NrUHJlUHVzaEhvb2sgaG9vayA9IG5ldyBNb2NrUHJlUHVzaEhvb2soZGIsIG91dCwgZXJyKTsKKwkJCWV4ZWN1dGVQdXNoKGhvb2spOworCQkJYXNzZXJ0RXF1YWxzKFN0YXR1cy5PSywgcnJ1T2suZ2V0U3RhdHVzKCkpOworCQkJYXNzZXJ0VHJ1ZShycnVPay5pc0Zhc3RGb3J3YXJkKCkpOworCQkJYXNzZXJ0RXF1YWxzKFN0YXR1cy5OT05fRVhJU1RJTkcsIHJydVJlamVjdC5nZXRTdGF0dXMoKSk7CisJCQlvdXQuZmx1c2goKTsKKwkJCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKGJ5dGVzLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIm51bGwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAiCisJCQkJCQkJKyAicmVmcy9oZWFkcy9tYXN0ZXIgMmMzNDkzMzViN2Y3OTcwNzJjZjcyOWM0ZjNiYjA5MTRlY2I2ZGVjOVxuIiwKKwkJCQkJcmVzdWx0KTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMzQ2LDEwICszNzQsMTggQEAgcHJpdmF0ZSBQdXNoUmVzdWx0IHRlc3RPbmVVcGRhdGVTdGF0dXMoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSwKIAkJCWZpbmFsIFJlZiBhZHZlcnRpc2VkUmVmLCBmaW5hbCBTdGF0dXMgZXhwZWN0ZWRTdGF0dXMsCiAJCQlCb29sZWFuIGZhc3RGb3J3YXJkKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLAogCQkJVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRlc3RPbmVVcGRhdGVTdGF0dXMocnJ1LCBhZHZlcnRpc2VkUmVmLCBleHBlY3RlZFN0YXR1cywKKwkJCQlmYXN0Rm9yd2FyZCwgbnVsbCk7CisJfQorCisJcHJpdmF0ZSBQdXNoUmVzdWx0IHRlc3RPbmVVcGRhdGVTdGF0dXMoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSwKKwkJCWZpbmFsIFJlZiBhZHZlcnRpc2VkUmVmLCBmaW5hbCBTdGF0dXMgZXhwZWN0ZWRTdGF0dXMsCisJCQlCb29sZWFuIGZhc3RGb3J3YXJkLCBQcmVQdXNoSG9vayBob29rKQorCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJcmVmVXBkYXRlcy5hZGQocnJ1KTsKIAkJaWYgKGFkdmVydGlzZWRSZWYgIT0gbnVsbCkKIAkJCWFkdmVydGlzZWRSZWZzLmFkZChhZHZlcnRpc2VkUmVmKTsKLQkJZmluYWwgUHVzaFJlc3VsdCByZXN1bHQgPSBleGVjdXRlUHVzaCgpOworCQlmaW5hbCBQdXNoUmVzdWx0IHJlc3VsdCA9IGV4ZWN1dGVQdXNoKGhvb2spOwogCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdGF0dXMsIHJydS5nZXRTdGF0dXMoKSk7CiAJCWlmIChmYXN0Rm9yd2FyZCAhPSBudWxsKQogCQkJYXNzZXJ0RXF1YWxzKGZhc3RGb3J3YXJkLCBCb29sZWFuLnZhbHVlT2YocnJ1LmlzRmFzdEZvcndhcmQoKSkpOwpAQCAtMzU4LDcgKzM5NCwxMiBAQCBwcml2YXRlIFB1c2hSZXN1bHQgdGVzdE9uZVVwZGF0ZVN0YXR1cyhmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1LAogCiAJcHJpdmF0ZSBQdXNoUmVzdWx0IGV4ZWN1dGVQdXNoKCkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwKIAkJCVRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0JCXByb2Nlc3MgPSBuZXcgUHVzaFByb2Nlc3ModHJhbnNwb3J0LCByZWZVcGRhdGVzKTsKKwkJcmV0dXJuIGV4ZWN1dGVQdXNoKG51bGwpOworCX0KKworCXByaXZhdGUgUHVzaFJlc3VsdCBleGVjdXRlUHVzaChQcmVQdXNoSG9vayBob29rKQorCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJcHJvY2VzcyA9IG5ldyBQdXNoUHJvY2Vzcyh0cmFuc3BvcnQsIHJlZlVwZGF0ZXMsIGhvb2spOwogCQlyZXR1cm4gcHJvY2Vzcy5leGVjdXRlKG5ldyBUZXh0UHJvZ3Jlc3NNb25pdG9yKCkpOwogCX0KIApAQCAtNDE2LDQgKzQ1NywyMCBAQCBwdWJsaWMgdm9pZCBwdXNoKFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCQkJfQogCQl9CiAJfQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja1ByZVB1c2hIb29rIGV4dGVuZHMgUHJlUHVzaEhvb2sgeworCisJCXByaXZhdGUgZmluYWwgUHJpbnRTdHJlYW0gb3V0cHV0OworCisJCXB1YmxpYyBNb2NrUHJlUHVzaEhvb2soUmVwb3NpdG9yeSByZXBvLCBQcmludFN0cmVhbSBvdXQsCisJCQkJUHJpbnRTdHJlYW0gZXJyKSB7CisJCQlzdXBlcihyZXBvLCBvdXQsIGVycik7CisJCQlvdXRwdXQgPSBvdXQ7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgZG9SdW4oKSB0aHJvd3MgQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQkJb3V0cHV0LnByaW50KGdldFN0ZGluQXJncygpKTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YQppbmRleCBkMWU1NDQ2Li5hOTFiYzk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrQWR2ZXJ0aXNlUmVmc0hvb2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFja0FkdmVydGlzZVJlZnNIb29rVGVzdC5qYXZhCkBAIC03MywxMSArNzMsMTQgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3VwZXIuc2V0VXAoKTsKIAogCQlzcmMgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShzcmMpOwogCQlkc3QgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOworCQlhZGRSZXBvVG9DbG9zZShkc3QpOwogCiAJCS8vIEZpbGwgZHN0IHdpdGggYSBzb21lIGNvbW1vbiBoaXN0b3J5LgogCQkvLwogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IGQgPSBuZXcgVGVzdFJlcG9zaXRvcnk8Pihkc3QpKSB7CisJCQlkc3QuaW5jcmVtZW50T3BlbigpOwogCQkJYSA9IGQuYmxvYigiYSIpOwogCQkJQSA9IGQuY29tbWl0KGQudHJlZShkLmZpbGUoImEiLCBhKSkpOwogCQkJQiA9IGQuY29tbWl0KCkucGFyZW50KEEpLmNyZWF0ZSgpOwpAQCAtMTA2LDkgKzEwOSw2IEBAIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJIaWRlc1ByaXZhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKIAkJCUBPdmVycmlkZQogCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkYikgewotCQkJCWRiLmNsb3NlKCk7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQogCQkJCWZpbmFsIFJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKIAkJCQlycC5zZXRBZHZlcnRpc2VSZWZzSG9vayhuZXcgSGlkZVByaXZhdGVIb29rKCkpOwogCQkJCXJldHVybiBycDsKQEAgLTEzNiw4ICsxMzYsNiBAQCBwdWJsaWMgdm9pZCByZXNldHNIYXZlcygpIHRocm93cyBFeGNlcHRpb24gewogCQkJCWRzdC5nZXREaXJlY3RvcnkoKSkgewogCQkJQE92ZXJyaWRlCiAJCQlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhSZXBvc2l0b3J5IGRiKSB7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQogCQkJCVJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKIAkJCQlycC5zZXRBZHZlcnRpc2VSZWZzSG9vayhuZXcgQWR2ZXJ0aXNlUmVmc0hvb2soKSB7CiAJCQkJCUBPdmVycmlkZQpAQCAtMTczLDkgKzE3MSw2IEBAIHByaXZhdGUgVHJhbnNwb3J0TG9jYWwgbmV3VHJhbnNwb3J0TG9jYWxXaXRoU3RyaWN0VmFsaWRhdGlvbigpCiAJCXJldHVybiBuZXcgVHJhbnNwb3J0TG9jYWwoc3JjLCB1cmlPZihkc3QpLCBkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKIAkJCUBPdmVycmlkZQogCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkYikgewotCQkJCWRiLmNsb3NlKCk7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQogCQkJCWZpbmFsIFJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKIAkJCQlycC5zZXRDaGVja1JlY2VpdmVkT2JqZWN0cyh0cnVlKTsKIAkJCQlycC5zZXRDaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlKHRydWUpOwpAQCAtMjExLDYgKzIwNiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIE5vdyB1c2UgYiBidXQgaW4gYSBkaWZmZXJlbnQgY29tbWl0IHRoYW4gd2hhdCBpcyBoaWRkZW4uCiAJCS8vCiAJCXRyeSAoVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gcyA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KHNyYykpIHsKKwkJCXNyYy5pbmNyZW1lbnRPcGVuKCk7CiAJCQlSZXZDb21taXQgTiA9IHMuY29tbWl0KCkucGFyZW50KEIpLmFkZCgicSIsIGIpLmNyZWF0ZSgpOwogCQkJcy51cGRhdGUoUl9NQVNURVIsIE4pOwogCkBAIC0yMjgsNyArMjI0LDYgQEAgcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCXRyeSAoVHJhbnNwb3J0TG9jYWwgdCA9IG5ld1RyYW5zcG9ydExvY2FsV2l0aFN0cmljdFZhbGlkYXRpb24oKSkgewogCQkJCXQuc2V0UHVzaFRoaW4odHJ1ZSk7CiAJCQkJciA9IHQucHVzaChQTSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHUpKTsKLQkJCQlkc3QuY2xvc2UoKTsKIAkJCX0KIAogCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSByZXN1bHQiLCByKTsKQEAgLTI5MCw2ICsyODUsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHJlY2VpdmUoZmluYWwgUmVjZWl2ZVBhY2sgcnAsCiAJcHVibGljIHZvaWQgdGVzdFVzaW5nSGlkZGVuRGVsdGFCYXNlRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYnl0ZVtdIGRlbHRhID0geyAweDEsIDB4MSwgMHgxLCAnYycgfTsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBzID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oc3JjKSkgeworCQkJc3JjLmluY3JlbWVudE9wZW4oKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikKIAkJCQkJLmFkZCgicSIsCiAJCQkJCQkJcy5ibG9iKEJpbmFyeURlbHRhLmFwcGx5KApAQCAtMzQ4LDYgKzM0NCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RVc2luZ0hpZGRlbkNvbW1vbkJsb2JGYWlscygpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBUcnkgdG8gdXNlIHRoZSAnYicgYmxvYiB0aGF0IGlzIGhpZGRlbi4KIAkJLy8KIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBzID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oc3JjKSkgeworCQkJc3JjLmluY3JlbWVudE9wZW4oKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCJxIiwgcy5ibG9iKCJiIikpLmNyZWF0ZSgpOwogCiAJCQkvLyBCdXQgZG9uJ3QgaW5jbHVkZSBpdCBpbiB0aGUgcGFjay4KQEAgLTQwMSw2ICszOTgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VXNpbmdVbmtub3duQmxvYkZhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIFRyeSB0byB1c2UgdGhlICduJyBibG9iIHRoYXQgaXMgbm90IG9uIHRoZSBzZXJ2ZXIuCiAJCS8vCiAJCXRyeSAoVGVzdFJlcG9zaXRvcnk8UmVwb3NpdG9yeT4gcyA9IG5ldyBUZXN0UmVwb3NpdG9yeTw+KHNyYykpIHsKKwkJCXNyYy5pbmNyZW1lbnRPcGVuKCk7CiAJCQlSZXZCbG9iIG4gPSBzLmJsb2IoIm4iKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCJxIiwgbikuY3JlYXRlKCk7CiAKQEAgLTQ5MSw2ICs0ODksNyBAQCBwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHNldHVwU291cmNlUmVwb0ludmFsaWRHaXRtb2R1bGVzKCkKIAkJCQkudG9TdHJpbmcoKTsKIAogCQl0cnkgKFRlc3RSZXBvc2l0b3J5PFJlcG9zaXRvcnk+IHMgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihzcmMpKSB7CisJCQlzcmMuaW5jcmVtZW50T3BlbigpOwogCQkJUmV2QmxvYiBibG9iID0gcy5ibG9iKGZha2VHaXRtb2R1bGVzKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCIuZ2l0bW9kdWxlcyIsIGJsb2IpCiAJCQkJCS5jcmVhdGUoKTsKQEAgLTUxNyw2ICs1MTYsNyBAQCBwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHNldHVwU291cmNlUmVwb0ludmFsaWRHaXRtb2R1bGVzKCkKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RVc2luZ1Vua25vd25UcmVlRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChUZXN0UmVwb3NpdG9yeTxSZXBvc2l0b3J5PiBzID0gbmV3IFRlc3RSZXBvc2l0b3J5PD4oc3JjKSkgeworCQkJc3JjLmluY3JlbWVudE9wZW4oKTsKIAkJCVJldkNvbW1pdCBOID0gcy5jb21taXQoKS5wYXJlbnQoQikuYWRkKCJxIiwgcy5ibG9iKCJhIikpLmNyZWF0ZSgpOwogCQkJUmV2VHJlZSB0ID0gcy5wYXJzZUJvZHkoTikuZ2V0VHJlZSgpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWNUZXN0LmphdmEKaW5kZXggNTU2OWJjYS4uYjU2MzA4YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlY1Rlc3QuamF2YQpAQCAtNDY2LDQgKzQ2NiwxOCBAQCBwdWJsaWMgdm9pZCBvbmx5V2lsZENhcmQoKSB7CiAJCWFzc2VydFRydWUoYS5tYXRjaFNvdXJjZSgicmVmcy9oZWFkcy9tYXN0ZXIiKSk7CiAJCWFzc2VydE51bGwoYS5nZXREZXN0aW5hdGlvbigpKTsKIAl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIG1hdGNoaW5nKCkgeworCQlSZWZTcGVjIGEgPSBuZXcgUmVmU3BlYygiOiIpOworCQlhc3NlcnRUcnVlKGEuaXNNYXRjaGluZygpKTsKKwkJYXNzZXJ0RmFsc2UoYS5pc0ZvcmNlVXBkYXRlKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbWF0Y2hpbmdGb3JjZWQoKSB7CisJCVJlZlNwZWMgYSA9IG5ldyBSZWZTcGVjKCIrOiIpOworCQlhc3NlcnRUcnVlKGEuaXNNYXRjaGluZygpKTsKKwkJYXNzZXJ0VHJ1ZShhLmlzRm9yY2VVcGRhdGUoKSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsdGVyQ29tbWFuZHNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWx0ZXJDb21tYW5kc1Rlc3QuamF2YQppbmRleCAzNmY5NGZiLi44OWQzMWMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWx0ZXJDb21tYW5kc1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWx0ZXJDb21tYW5kc1Rlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYsIENocmlzdGlhbiBIYWxzdHJpY2sgPGNocmlzdGlhbi5oYWxzdHJpY2tAc2FwLmNvbT4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDE2LCAyMDIyIENocmlzdGlhbiBIYWxzdHJpY2sgPGNocmlzdGlhbi5oYWxzdHJpY2tAc2FwLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsMTIgKzEwLDE3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5NZXJnZVJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcy5GaWx0ZXJDb21tYW5kRmFjdG9yeTsKQEAgLTg2LDYgKzkxLDE0IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNlY29uZENvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJTZWNvbmQgY29tbWl0IikuY2FsbCgpOwogCX0KIAorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVNldDxTdHJpbmc+IGV4aXN0aW5nRmlsdGVycyA9IG5ldyBIYXNoU2V0PD4oCisJCQkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRGaWx0ZXJDb21tYW5kcygpKTsKKwkJZXhpc3RpbmdGaWx0ZXJzLmZvckVhY2goRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5Ojp1bnJlZ2lzdGVyKTsKKwkJc3VwZXIudGVhckRvd24oKTsKKwl9CisKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RCdWlsdGluQ2xlYW5GaWx0ZXIoKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24gewpAQCAtMjE3LDQgKzIzMCwxMzMgQEAgcHVibGljIHZvaWQgdGVzdEJ1aWx0aW5DbGVhbkFuZFNtdWRnZUZpbHRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW8KIAkJY29uZmlnLnNhdmUoKTsKIAl9CiAKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RCcmFuY2hTd2l0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGJ1aWx0aW5Db21tYW5kUHJlZml4ID0gImpnaXQ6Ly9idWlsdGluL3Rlc3QvIjsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKGJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIsCisJCQkJbmV3IFRlc3RDb21tYW5kRmFjdG9yeSgncycpKTsKKwkJRmlsdGVyQ29tbWFuZFJlZ2lzdHJ5LnJlZ2lzdGVyKGJ1aWx0aW5Db21tYW5kUHJlZml4ICsgImNsZWFuIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdjJykpOworCQlTdG9yZWRDb25maWcgY29uZmlnID0gZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgInRlc3QiLCAic211ZGdlIiwKKwkJCQlidWlsdGluQ29tbWFuZFByZWZpeCArICJzbXVkZ2UiKTsKKwkJY29uZmlnLnNldFN0cmluZygiZmlsdGVyIiwgInRlc3QiLCAiY2xlYW4iLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgImNsZWFuIik7CisJCWNvbmZpZy5zYXZlKCk7CisJCS8vIFdlJ3JlIG9uIHRoZSB0ZXN0IGJyYW5jaAorCQlGaWxlIGFGaWxlID0gd3JpdGVUcmFzaEZpbGUoImEudHh0IiwgImEiKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgImEudHh0IGZpbHRlcj10ZXN0Iik7CisJCUZpbGUgY0ZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiY2MvYy50eHQiLCAiQyIpOworCQl3cml0ZVRyYXNoRmlsZSgiY2MvLmdpdGF0dHJpYnV0ZXMiLCAiYy50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gdGVzdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgib3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiYi50eHQiLCAiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYi50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gb3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoInRlc3QiKS5jYWxsKCk7CisJCWNoZWNrRmlsZShhRmlsZSwgInNjc2EiKTsKKwkJY2hlY2tGaWxlKGNGaWxlLCAic2NzQyIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdENoZWNrb3V0U2luZ2xlRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYnVpbHRpbkNvbW1hbmRQcmVmaXggPSAiamdpdDovL2J1aWx0aW4vdGVzdC8iOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAic211ZGdlIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdzJykpOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iLAorCQkJCW5ldyBUZXN0Q29tbWFuZEZhY3RvcnkoJ2MnKSk7CisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJzbXVkZ2UiLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJjbGVhbiIsCisJCQkJYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iKTsKKwkJY29uZmlnLnNhdmUoKTsKKwkJLy8gV2UncmUgb24gdGhlIHRlc3QgYnJhbmNoCisJCUZpbGUgYUZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiYS50eHQiLCAiYSIpOworCQlGaWxlIGF0dHJpYnV0ZXMgPSB3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYS50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gdGVzdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgib3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiYi50eHQiLCAiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYi50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gb3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKKwkJYXNzZXJ0RmFsc2UoYUZpbGUuZXhpc3RzKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmV4aXN0cygpKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0U3RhcnRQb2ludCgidGVzdCIpLmFkZFBhdGgoImEudHh0IikuY2FsbCgpOworCQljaGVja0ZpbGUoYUZpbGUsICJzY3NhIik7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRTaW5nbGVGaWxlMigpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYnVpbHRpbkNvbW1hbmRQcmVmaXggPSAiamdpdDovL2J1aWx0aW4vdGVzdC8iOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAic211ZGdlIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdzJykpOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iLAorCQkJCW5ldyBUZXN0Q29tbWFuZEZhY3RvcnkoJ2MnKSk7CisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJzbXVkZ2UiLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJjbGVhbiIsCisJCQkJYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iKTsKKwkJY29uZmlnLnNhdmUoKTsKKwkJLy8gV2UncmUgb24gdGhlIHRlc3QgYnJhbmNoCisJCUZpbGUgYUZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiYS50eHQiLCAiYSIpOworCQlGaWxlIGF0dHJpYnV0ZXMgPSB3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYS50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gdGVzdCIpLmNhbGwoKTsKKwkJZ2l0LmNoZWNrb3V0KCkuc2V0TmFtZSgibWFzdGVyIikuY2FsbCgpOworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgib3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQl3cml0ZVRyYXNoRmlsZSgiYi50eHQiLCAiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYi50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiT24gb3RoZXIiKS5jYWxsKCk7CisJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKKwkJYXNzZXJ0RmFsc2UoYUZpbGUuZXhpc3RzKCkpOworCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmV4aXN0cygpKTsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRhdHRyaWJ1dGVzIiwgIiIpOworCQlnaXQuY2hlY2tvdXQoKS5zZXRTdGFydFBvaW50KCJ0ZXN0IikuYWRkUGF0aCgiYS50eHQiKS5jYWxsKCk7CisJCWNoZWNrRmlsZShhRmlsZSwgInNjc2EiKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RNZXJnZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgYnVpbHRpbkNvbW1hbmRQcmVmaXggPSAiamdpdDovL2J1aWx0aW4vdGVzdC8iOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAic211ZGdlIiwKKwkJCQluZXcgVGVzdENvbW1hbmRGYWN0b3J5KCdzJykpOworCQlGaWx0ZXJDb21tYW5kUmVnaXN0cnkucmVnaXN0ZXIoYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iLAorCQkJCW5ldyBUZXN0Q29tbWFuZEZhY3RvcnkoJ2MnKSk7CisJCVN0b3JlZENvbmZpZyBjb25maWcgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJzbXVkZ2UiLAorCQkJCWJ1aWx0aW5Db21tYW5kUHJlZml4ICsgInNtdWRnZSIpOworCQljb25maWcuc2V0U3RyaW5nKCJmaWx0ZXIiLCAidGVzdCIsICJjbGVhbiIsCisJCQkJYnVpbHRpbkNvbW1hbmRQcmVmaXggKyAiY2xlYW4iKTsKKwkJY29uZmlnLnNhdmUoKTsKKwkJLy8gV2UncmUgb24gdGhlIHRlc3QgYnJhbmNoLiBTZXQgdXAgdHdvIGJyYW5jaGVzIHRoYXQgYXJlIGV4cGVjdGVkIHRvCisJCS8vIG1lcmdlIGNsZWFubHkuCisJCUZpbGUgYUZpbGUgPSB3cml0ZVRyYXNoRmlsZSgiYS50eHQiLCAiYSIpOworCQl3cml0ZVRyYXNoRmlsZSgiLmdpdGF0dHJpYnV0ZXMiLCAiYS50eHQgZmlsdGVyPXRlc3QiKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQlSZXZDb21taXQgYUNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJPbiB0ZXN0IikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7CisJCWFzc2VydEZhbHNlKGFGaWxlLmV4aXN0cygpKTsKKwkJZ2l0LmJyYW5jaENyZWF0ZSgpLnNldE5hbWUoIm90aGVyIikuY2FsbCgpOworCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJvdGhlciIpLmNhbGwoKTsKKwkJd3JpdGVUcmFzaEZpbGUoImIvYi50eHQiLCAiYiIpOworCQl3cml0ZVRyYXNoRmlsZSgiYi8uZ2l0YXR0cmlidXRlcyIsICJiLnR4dCBmaWx0ZXI9dGVzdCIpOworCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJPbiBvdGhlciIpLmNhbGwoKTsKKwkJTWVyZ2VSZXN1bHQgcmVzdWx0ID0gZ2l0Lm1lcmdlKCkuaW5jbHVkZShhQ29tbWl0KS5jYWxsKCk7CisJCWFzc2VydEVxdWFscyhNZXJnZVJlc3VsdC5NZXJnZVN0YXR1cy5NRVJHRUQsIHJlc3VsdC5nZXRNZXJnZVN0YXR1cygpKTsKKwkJY2hlY2tGaWxlKGFGaWxlLCAic2NzYSIpOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNTdhOGJlZS4uN2JhYTIxNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC00LDE0ICs0LDE0IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQudWkKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQudWkKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTExCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSI2LjAuMSIKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldnBsb3Q7dmVyc2lvbj0iWzYuMC4xLDYuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils2LjAuMSw2LjEuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNi4wLjEsNi4xLjApIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iNi4xLjEiCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils2LjEuMSw2LjIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNi4xLjEsNi4yLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzYuMS4xLDYuMi4wKSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggMzM1YzE1Ny4uNzVmM2QyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC51aSAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQudWkuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnVpO3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdC51aTt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC51aS9wb20ueG1sCmluZGV4IGM0YTNlMmEuLjEyNWUxMjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudWkvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3BvbS54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LnVpPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzIGIvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODhlODU3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KLTxjb21wb25lbnQgaWQ9Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjIiPgotICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvR2FyYmFnZUNvbGxlY3RDb21tYW5kLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQuYXBpLkdhcmJhZ2VDb2xsZWN0Q29tbWFuZCI+Ci0gICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgotICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjEzLjMiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ic2V0UGFja0tlcHRPYmplY3RzKGJvb2xlYW4pIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICA8L2ZpbHRlcj4KLSAgICA8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbiI+Ci0gICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgotICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjEzLjEiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uKFVSSWlzaCwgU3RyaW5nLCBUaHJvd2FibGUpIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICA8L2ZpbHRlcj4KLSAgICA8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja01pc21hdGNoRXhjZXB0aW9uLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlBhY2tNaXNtYXRjaEV4Y2VwdGlvbiI+Ci0gICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgotICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjkuMSIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJpc1Blcm1hbmVudCgpIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgPGZpbHRlciBpZD0iMTE0Mjk0Nzg0MyI+Ci0gICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuOS4xIi8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9InNldFBlcm1hbmVudChib29sZWFuKSIvPgotICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgPC9maWx0ZXI+Ci0gICAgPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0NvbnN0YW50cy5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMiPgotICAgICAgICA8ZmlsdGVyIGlkPSIxMTQyOTQ3ODQzIj4KLSAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4xMy4yIi8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkNPTkZJR19LRVlfQklUTUFQX0VYQ0xVREVEX1JFRlNfUFJFRklYRVMiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgIDwvZmlsdGVyPgotICAgICAgICA8ZmlsdGVyIGlkPSIxMTQyOTQ3ODQzIj4KLSAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4xMy4yIi8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkNPTkZJR19LRVlfUFJFU0VSVkVfT0xEX1BBQ0tTIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgPGZpbHRlciBpZD0iMTE0Mjk0Nzg0MyI+Ci0gICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMTMuMiIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJDT05GSUdfS0VZX1BSVU5FX1BSRVNFUlZFRCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgotICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjEzLjIiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iQ09ORklHX0tFWV9TS0lQSEFTSCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgotICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjEzLjIiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iU0hBMV9JTVBMRU1FTlRBVElPTiIvPgotICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgotICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjEzLjMiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iQ09ORklHX0tFWV9QQUNLX0tFUFRfT0JKRUNUUyIvPgotICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgotICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjEzLjMiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iQ09ORklHX1JFUEFDS19TRUNUSU9OIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICA8L2ZpbHRlcj4KLSAgICA8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZSBwYXRoPSJzcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeS5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5Ij4KLSAgICAgICAgPGZpbHRlciBpZD0iMTE0Mjk0Nzg0MyI+Ci0gICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMTMuMiIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJnZXRSZWZsb2dSZWFkZXIoUmVmKSIvPgotICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgPC9maWx0ZXI+Ci0gICAgPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9wYWNrL1BhY2tDb25maWcuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2suUGFja0NvbmZpZyI+Ci0gICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgotICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjEzLjIiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iREVGQVVMVF9CSVRNQVBfRVhDTFVERURfUkVGU19QUkVGSVhFUyIvPgotICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgotICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjEzLjIiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iZ2V0Qml0bWFwRXhjbHVkZWRSZWZzUHJlZml4ZXMoKSIvPgotICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgIDxmaWx0ZXIgaWQ9IjExNDI5NDc4NDMiPgotICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI1LjEzLjIiLz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0ic2V0Qml0bWFwRXhjbHVkZWRSZWZzUHJlZml4ZXMoU3RyaW5nW10pIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgPGZpbHRlciBpZD0iMTE0Mjk0Nzg0MyI+Ci0gICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMTMuMyIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJERUZBVUxUX1BBQ0tfS0VQVF9PQkpFQ1RTIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgPGZpbHRlciBpZD0iMTE0Mjk0Nzg0MyI+Ci0gICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMTMuMyIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJpc1BhY2tLZXB0T2JqZWN0cygpIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgotICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgPGZpbHRlciBpZD0iMTE0Mjk0Nzg0MyI+Ci0gICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMTMuMyIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJzZXRQYWNrS2VwdE9iamVjdHMoYm9vbGVhbikiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgIDwvZmlsdGVyPgotICAgIDwvcmVzb3VyY2U+Ci0gICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Bd3NSZXF1ZXN0U2lnbmVyVjQuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuQXdzUmVxdWVzdFNpZ25lclY0Ij4KLSAgICAgICAgPGZpbHRlciBpZD0iMTEwOTM5MzQxMSI+Ci0gICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMTMuMSIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Bd3NSZXF1ZXN0U2lnbmVyVjQiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgIDwvZmlsdGVyPgotICAgIDwvcmVzb3VyY2U+Ci0gICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSHR0cFN1cHBvcnQuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0Ij4KLSAgICAgICAgPGZpbHRlciBpZD0iMTE0Mjk0Nzg0MyI+Ci0gICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMTMuMSIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJ1cmxFbmNvZGUoU3RyaW5nLCBib29sZWFuKSIvPgotICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgPC9maWx0ZXI+Ci0gICAgPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9zaGExL1NIQTEuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTEuU0hBMSRTaGExSW1wbGVtZW50YXRpb24iPgotICAgICAgICA8ZmlsdGVyIGlkPSIxMTQyOTQ3ODQzIj4KLSAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4xMy4yIi8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IlNoYTFJbXBsZW1lbnRhdGlvbiIvPgotICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KLSAgICAgICAgPC9maWx0ZXI+Ci0gICAgPC9yZXNvdXJjZT4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZmJlMzFlOS4uYmFjMDI3YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDEyICszLDEyIEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA2LjEuMS5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKIEVjbGlwc2UtRXh0ZW5zaWJsZUFQSTogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249IjYuMC4xIjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQubm90ZXMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLApAQCAtMjMsMTggKzIzLDE4IEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5ibGFtZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsayIsCi0gb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5ibGFtZTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaWZmIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcywKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKQEAgLTQyLDQ0ICs0Miw0OCBAQAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjayIsCi0gb3JnLmVjbGlwc2UuamdpdC5ldmVudHM7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLnhtbC5zYXguaGVscGVycywKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXBpLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcueG1sLnNheCIsCi0gb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLmludGVybmFsO3ZlcnNpb249IjYuMC4xIjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iNi4wLjEiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCi0gb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uaW50ZXJuYWw7dmVyc2lvbj0iNi4xLjEiO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamdpdC5ob29rczt2ZXJzaW9uPSI2LjEuMSI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTt2ZXJzaW9uPSI2LjEuMSIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7dmVyc2lvbj0iNi4xLjEiOworICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCisgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0LAorICAgb3JnLmVjbGlwc2UuamdpdC5wZ20iLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSI2LjEuMSI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5yZXZ3YWxrO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnJldndhbGs7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LAogICAgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwLApAQCAtOTAsMzIgKzk0LDMyIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUudGVzdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuc3NoLmpzY2gudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LAogICAgb3JnLmVjbGlwc2UuamdpdC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5wZ20iLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSI2LjEuMSI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdWJtb2R1bGU7dmVyc2lvbj0iNi4wLjEiO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuY29ubmVjdGl2aXR5O3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN1Ym1vZHVsZTt2ZXJzaW9uPSI2LjEuMSI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5jb25uZWN0aXZpdHk7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwudHJhbnNwb3J0LnBhcnNlcjt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQucGFyc2VyO3ZlcnNpb249IjYuMS4xIjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC50cmFuc3BvcnQuc3NoO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnRyYW5zcG9ydC5zc2g7dmVyc2lvbj0iNi4xLjEiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLAogICAgb3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMSwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUsCkBAIC0xMjksMTAgKzEzMywxMSBAQAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLAogICAgb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGUsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWw7dmVyc2lvbj0iNi4wLjEiOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQubG9nZ2luZzt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWw7dmVyc2lvbj0iNi4xLjEiOworICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QsCisgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCisgb3JnLmVjbGlwc2UuamdpdC5sb2dnaW5nO3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKQEAgLTE0MSw0MCArMTQ2LDQwIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlcyIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iNi4wLjEiLAotIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249IjYuMS4xIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UiLAotIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlmZiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSI2LjAuMSI7Cisgb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGU7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJqYXZheC5jcnlwdG8sCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8sCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmxpYiwKQEAgLTE4NywyMSArMTkyLDIxIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrLAogICAgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0iamF2YXgubmV0LnNzbCIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249IjYuMS4xIjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iNi4wLjEiOworIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSI2LjEuMSI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuaG9va3MsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCkBAIC0yMTQsMTIgKzIxOSwxMiBAQAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIGphdmF4Lm5ldC5zc2wsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249IjYuMC4xIjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iNi4xLjEiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSI2LjAuMSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iNi4wLjEiCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTE7dmVyc2lvbj0iNi4xLjEiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC50aW1lO3ZlcnNpb249IjYuMS4xIgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xMQogSW1wb3J0LVBhY2thZ2U6IGNvbS5nb29nbGVjb2RlLmphdmFld2FoO3ZlcnNpb249IlsxLjEuNiwyLjAuMCkiLAogIGphdmF4LmNyeXB0bywKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKaW5kZXggMzAyYzQ1NC4uMzNlNjE1NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdCAtIFNvdXJjZXMKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuc291cmNlCiBCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZyAtIEpHaXQKLUJ1bmRsZS1WZXJzaW9uOiA2LjAuMS5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0O3ZlcnNpb249IjYuMC4xLnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNi4xLjEucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdDt2ZXJzaW9uPSI2LjEuMS5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC9wb20ueG1sCmluZGV4IGU3ODIyNzIuLmYwZTkyYjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3BvbS54bWwKQEAgLTIwLDcgKzIwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjYuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzCmluZGV4IDQ4ZTQ3MjAuLjgwYjA4NjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMKQEAgLTM2MSw2ICszNjEsOCBAQAogaW5NZW1vcnlCdWZmZXJMaW1pdEV4Y2VlZGVkPUluLW1lbW9yeSBidWZmZXIgbGltaXQgZXhjZWVkZWQKIGlucHV0RGlkbnRNYXRjaExlbmd0aD1JbnB1dCBkaWQgbm90IG1hdGNoIHN1cHBsaWVkIGxlbmd0aC4gezB9IGJ5dGVzIGFyZSBtaXNzaW5nLgogaW5wdXRTdHJlYW1NdXN0U3VwcG9ydE1hcms9SW5wdXRTdHJlYW0gbXVzdCBzdXBwb3J0IG1hcmsoKQoraW50ZWdlclZhbHVlTm90SW5SYW5nZT1JbnRlZ2VyIHZhbHVlIHswfS57MX0gPSB7Mn0gbm90IGluIHJhbmdlIHszfS4uezR9CitpbnRlZ2VyVmFsdWVOb3RJblJhbmdlU3ViU2VjdGlvbj1JbnRlZ2VyIHZhbHVlIHswfS57MX0uezJ9ID0gezN9IG5vdCBpbiByYW5nZSB7NH0uLns1fQogaW50ZWdlclZhbHVlT3V0T2ZSYW5nZT1JbnRlZ2VyIHZhbHVlIHswfS57MX0gb3V0IG9mIHJhbmdlCiBpbnRlcm5hbFJldmlzaW9uRXJyb3I9aW50ZXJuYWwgcmV2aXNpb24gZXJyb3IKIGludGVybmFsU2VydmVyRXJyb3I9aW50ZXJuYWwgc2VydmVyIGVycm9yCkBAIC0zNzIsNiArMzc0LDcgQEAKIGludmFsaWRCb29sZWFuVmFsdWU9SW52YWxpZCBib29sZWFuIHZhbHVlOiB7MH0uezF9PXsyfQogaW52YWxpZENoYW5uZWw9SW52YWxpZCBjaGFubmVsIHswfQogaW52YWxpZENvbW1pdFBhcmVudE51bWJlcj1JbnZhbGlkIGNvbW1pdCBwYXJlbnQgbnVtYmVyCitpbnZhbGlkQ29yZUFiYnJldj1JbnZhbGlkIHZhbHVlIHswfSBvZiBvcHRpb24gY29yZS5hYmJyZXYKIGludmFsaWREZXB0aD1JbnZhbGlkIGRlcHRoOiB7MH0KIGludmFsaWRFbmNvZGluZz1JbnZhbGlkIGVuY29kaW5nIGZyb20gZ2l0IGNvbmZpZyBpMThuLmNvbW1pdEVuY29kaW5nOiB7MH0KIGludmFsaWRFbmNyeXB0aW9uPUludmFsaWQgZW5jcnlwdGlvbgpAQCAtNTczLDYgKzU3NiwxMSBAQAogcHVzaENlcnRpZmljYXRlSW52YWxpZEZpZWxkVmFsdWU9UHVzaCBjZXJ0aWZpY2F0ZSBoYXMgbWlzc2luZyBvciBpbnZhbGlkIHZhbHVlIGZvciB7MH06IHsxfQogcHVzaENlcnRpZmljYXRlSW52YWxpZEhlYWRlcj1QdXNoIGNlcnRpZmljYXRlIGhhcyBpbnZhbGlkIGhlYWRlciBmb3JtYXQKIHB1c2hDZXJ0aWZpY2F0ZUludmFsaWRTaWduYXR1cmU9UHVzaCBjZXJ0aWZpY2F0ZSBoYXMgaW52YWxpZCBzaWduYXR1cmUgZm9ybWF0CitwdXNoRGVmYXVsdE5vdGhpbmc9Tm8gcmVmc3BlYyBnaXZlbiBhbmQgcHVzaC5kZWZhdWx0PW5vdGhpbmc7IG5vIHVwc3RyZWFtIGJyYW5jaCBjYW4gYmUgZGV0ZXJtaW5lZAorcHVzaERlZmF1bHROb1Vwc3RyZWFtPU5vIHVwc3RyZWFtIGJyYW5jaCBmb3VuZCBmb3IgbG9jYWwgYnJhbmNoICcnezB9JycKK3B1c2hEZWZhdWx0U2ltcGxlPXB1c2guZGVmYXVsdD1zaW1wbGUgcmVxdWlyZXMgbG9jYWwgYnJhbmNoIG5hbWUgJyd7MH0nJyB0byBiZSBlcXVhbCB0byB1cHN0cmVhbSB0cmFja2VkIGJyYW5jaCBuYW1lICcnezF9JycKK3B1c2hEZWZhdWx0VHJpYW5ndWxhclVwc3RyZWFtPXB1c2guZGVmYXVsdD11cHN0cmVhbSBjYW5ub3QgYmUgdXNlZCB3aGVuIHRoZSBwdXNoIHJlbW90ZSAnJ3swfScnIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBmZXRjaCByZW1vdGUgJyd7MX0nJworcHVzaERlZmF1bHRVbmtub3duPVVua25vd24gcHVzaC5kZWZhdWx0PXswfTsgY2Fubm90IHB1c2gKIHB1c2hJc05vdFN1cHBvcnRlZEZvckJ1bmRsZVRyYW5zcG9ydD1QdXNoIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGJ1bmRsZSB0cmFuc3BvcnQKIHB1c2hOb3RQZXJtaXR0ZWQ9cHVzaCBub3QgcGVybWl0dGVkCiBwdXNoT3B0aW9uc05vdFN1cHBvcnRlZD1QdXNoIG9wdGlvbnMgbm90IHN1cHBvcnRlZDsgcmVjZWl2ZWQgezB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmQuamF2YQppbmRleCA3OTIyZjllLi5mODgxNzlhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEKQEAgLTksNiArOSw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CkBAIC0xMjQsNyArMTI2LDcgQEAgcHVibGljIENoZXJyeVBpY2tSZXN1bHQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIE5vTWVzc2FnZUV4Y2VwdGlvbiwKIAkJCQlmaW5hbCBSZXZDb21taXQgc3JjUGFyZW50ID0gZ2V0UGFyZW50Q29tbWl0KHNyY0NvbW1pdCwgcmV2V2Fsayk7CiAKIAkJCQlTdHJpbmcgb3VyTmFtZSA9IGNhbGN1bGF0ZU91ck5hbWUoaGVhZFJlZik7Ci0JCQkJU3RyaW5nIGNoZXJyeVBpY2tOYW1lID0gc3JjQ29tbWl0LmdldElkKCkuYWJicmV2aWF0ZSg3KS5uYW1lKCkKKwkJCQlTdHJpbmcgY2hlcnJ5UGlja05hbWUgPSBzcmNDb21taXQuZ2V0SWQoKS5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkubmFtZSgpCiAJCQkJCQkrICIgIiArIHNyY0NvbW1pdC5nZXRTaG9ydE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAogCiAJCQkJTWVyZ2VyIG1lcmdlciA9IHN0cmF0ZWd5Lm5ld01lcmdlcihyZXBvKTsKQEAgLTE4Myw3ICsxODUsNyBAQCBwdWJsaWMgQ2hlcnJ5UGlja1Jlc3VsdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgTm9NZXNzYWdlRXhjZXB0aW9uLAogCQkJCQlpZiAodW5tZXJnZWRQYXRocyAhPSBudWxsKSB7CiAJCQkJCQltZXNzYWdlID0gbmV3IE1lcmdlTWVzc2FnZUZvcm1hdHRlcigpCiAJCQkJCQkJLmZvcm1hdFdpdGhDb25mbGljdHMoc3JjQ29tbWl0LmdldEZ1bGxNZXNzYWdlKCksCi0JCQkJCQkJCQkJdW5tZXJnZWRQYXRocyk7CisJCQkJCQkJCQkJdW5tZXJnZWRQYXRocywgJyMnKTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCW1lc3NhZ2UgPSBzcmNDb21taXQuZ2V0RnVsbE1lc3NhZ2UoKTsKIAkJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZC5qYXZhCmluZGV4IDM3ZjFkNDguLjdhNTkxYWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQ2FuY2VsZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkNvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb247CkBAIC00Niw2ICs0Nyw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ob29rcy5QcmVDb21taXRIb29rOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0Q29uZmlnLkNsZWFudXBNb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5HcGdDb25maWc7CkBAIC0xMzMsNiArMTM2LDEyIEBAIHB1YmxpYyBjbGFzcyBDb21taXRDb21tYW5kIGV4dGVuZHMgR2l0Q29tbWFuZDxSZXZDb21taXQ+IHsKIAogCXByaXZhdGUgQ3JlZGVudGlhbHNQcm92aWRlciBjcmVkZW50aWFsc1Byb3ZpZGVyOwogCisJcHJpdmF0ZSBATm9uTnVsbCBDbGVhbnVwTW9kZSBjbGVhbnVwTW9kZSA9IENsZWFudXBNb2RlLlZFUkJBVElNOworCisJcHJpdmF0ZSBib29sZWFuIGNsZWFuRGVmYXVsdElzU3RyaXAgPSB0cnVlOworCisJcHJpdmF0ZSBDaGFyYWN0ZXIgY29tbWVudENoYXI7CisKIAkvKioKIAkgKiBDb25zdHJ1Y3RvciBmb3IgQ29tbWl0Q29tbWFuZAogCSAqCkBAIC0yMDAsNyArMjA5LDcgQEAgcHVibGljIFJldkNvbW1pdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbiwKIAkJCQl0aHJvdyBuZXcgV3JvbmdSZXBvc2l0b3J5U3RhdGVFeGNlcHRpb24oCiAJCQkJCQlKR2l0VGV4dC5nZXQoKS5jb21taXRBbWVuZE9uSW5pdGlhbE5vdFBvc3NpYmxlKTsKIAotCQkJaWYgKGhlYWRJZCAhPSBudWxsKQorCQkJaWYgKGhlYWRJZCAhPSBudWxsKSB7CiAJCQkJaWYgKGFtZW5kKSB7CiAJCQkJCVJldkNvbW1pdCBwcmV2aW91c0NvbW1pdCA9IHJ3LnBhcnNlQ29tbWl0KGhlYWRJZCk7CiAJCQkJCWZvciAoUmV2Q29tbWl0IHAgOiBwcmV2aW91c0NvbW1pdC5nZXRQYXJlbnRzKCkpCkBAIC0yMTAsNyArMjE5LDcgQEAgcHVibGljIFJldkNvbW1pdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbiwKIAkJCQl9IGVsc2UgewogCQkJCQlwYXJlbnRzLmFkZCgwLCBoZWFkSWQpOwogCQkJCX0KLQorCQkJfQogCQkJaWYgKCFub1ZlcmlmeSkgewogCQkJCW1lc3NhZ2UgPSBIb29rcwogCQkJCQkJLmNvbW1pdE1zZyhyZXBvLApAQCAtMjE5LDYgKzIyOCwxOSBAQCBwdWJsaWMgUmV2Q29tbWl0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBBYm9ydGVkQnlIb29rRXhjZXB0aW9uLAogCQkJCQkJLnNldENvbW1pdE1lc3NhZ2UobWVzc2FnZSkuY2FsbCgpOwogCQkJfQogCisJCQlDb21taXRDb25maWcgY29uZmlnID0gbnVsbDsKKwkJCWlmIChDbGVhbnVwTW9kZS5ERUZBVUxULmVxdWFscyhjbGVhbnVwTW9kZSkpIHsKKwkJCQljb25maWcgPSByZXBvLmdldENvbmZpZygpLmdldChDb21taXRDb25maWcuS0VZKTsKKwkJCQljbGVhbnVwTW9kZSA9IGNvbmZpZy5yZXNvbHZlKGNsZWFudXBNb2RlLCBjbGVhbkRlZmF1bHRJc1N0cmlwKTsKKwkJCX0KKwkJCWNoYXIgY29tbWVudHM7CisJCQlpZiAoY29tbWVudENoYXIgPT0gbnVsbCkgeworCQkJCWNvbW1lbnRzID0gJyMnOyAvLyBUT0RPIHVzZSBnaXQgY29uZmlnIGNvcmUuY29tbWVudENoYXIKKwkJCX0gZWxzZSB7CisJCQkJY29tbWVudHMgPSBjb21tZW50Q2hhci5jaGFyVmFsdWUoKTsKKwkJCX0KKwkJCW1lc3NhZ2UgPSBDb21taXRDb25maWcuY2xlYW5UZXh0KG1lc3NhZ2UsIGNsZWFudXBNb2RlLCBjb21tZW50cyk7CisKIAkJCVJldkNvbW1pdCByZXZDb21taXQ7CiAJCQlEaXJDYWNoZSBpbmRleCA9IHJlcG8ubG9ja0RpckNhY2hlKCk7CiAJCQl0cnkgKE9iamVjdEluc2VydGVyIG9kaSA9IHJlcG8ubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgewpAQCAtNjU4LDYgKzY4MCw1NyBAQCBwdWJsaWMgQ29tbWl0Q29tbWFuZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CiAJfQogCiAJLyoqCisJICogU2V0cyB0aGUge0BsaW5rIENsZWFudXBNb2RlfSB0byBhcHBseSB0byB0aGUgY29tbWl0IG1lc3NhZ2UuIElmIG5vdAorCSAqIGNhbGxlZCwge0BsaW5rIENvbW1pdENvbW1hbmR9IGFwcGxpZXMge0BsaW5rIENsZWFudXBNb2RlI1ZFUkJBVElNfS4KKwkgKgorCSAqIEBwYXJhbSBtb2RlCisJICogICAgICAgICAgICB7QGxpbmsgQ2xlYW51cE1vZGV9IHRvIHNldAorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBDb21taXRDb21tYW5kIHNldENsZWFudXBNb2RlKEBOb25OdWxsIENsZWFudXBNb2RlIG1vZGUpIHsKKwkJY2hlY2tDYWxsYWJsZSgpOworCQl0aGlzLmNsZWFudXBNb2RlID0gbW9kZTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZGVmYXVsdCBjbGVhbiBtb2RlIGlmIHtAbGluayAjc2V0Q2xlYW51cE1vZGUoQ2xlYW51cE1vZGUpCisJICogc2V0Q2xlYW51cE1vZGUoQ2xlYW51cE1vZGUuREVGQVVMVCl9IGlzIHNldCBhbmQgZ2l0IGNvbmZpZworCSAqIHtAY29kZSBjb21taXQuY2xlYW51cCA9IGRlZmF1bHR9IG9yIGlzIG5vdCBzZXQuCisJICoKKwkgKiBAcGFyYW0gc3RyaXAKKwkgKiAgICAgICAgICAgIGlmIHtAY29kZSB0cnVlfSwgZGVmYXVsdCB0byB7QGxpbmsgQ2xlYW51cE1vZGUjU1RSSVB9OworCSAqICAgICAgICAgICAgb3RoZXJ3aXNlIGRlZmF1bHQgdG8ge0BsaW5rIENsZWFudXBNb2RlI1dISVRFU1BBQ0V9CisJICogQHJldHVybiB7QGNvZGUgdGhpc30KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIENvbW1pdENvbW1hbmQgc2V0RGVmYXVsdENsZWFuKGJvb2xlYW4gc3RyaXApIHsKKwkJY2hlY2tDYWxsYWJsZSgpOworCQl0aGlzLmNsZWFuRGVmYXVsdElzU3RyaXAgPSBzdHJpcDsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgY29tbWVudCBjaGFyYWN0ZXIgdG8gYXBwbHkgd2hlbiBjbGVhbmluZyBhIGNvbW1pdCBtZXNzYWdlLiBJZgorCSAqIHtAY29kZSBudWxsfSAodGhlIGRlZmF1bHQpIGFuZCB0aGUge0BsaW5rICNzZXRDbGVhbnVwTW9kZShDbGVhbnVwTW9kZSkKKwkgKiBjbGVhbi11cCBtb2RlfSBpcyB7QGxpbmsgQ2xlYW51cE1vZGUjU1RSSVB9IG9yCisJICoge0BsaW5rIENsZWFudXBNb2RlI1NDSVNTT1JTfSwgdGhlIHZhbHVlIG9mIGdpdCBjb25maWcKKwkgKiB7QGNvZGUgY29yZS5jb21tZW50Q2hhcn0gd2lsbCBiZSB1c2VkLgorCSAqCisJICogQHBhcmFtIGNvbW1lbnRDaGFyCisJICogICAgICAgICAgICB0aGUgY29tbWVudCBjaGFyYWN0ZXIsIG9yIHtAY29kZSBudWxsfSB0byB1c2UgdGhlIHZhbHVlIGZyb20KKwkgKiAgICAgICAgICAgIHRoZSBnaXQgY29uZmlnCisJICogQHJldHVybiB7QGNvZGUgdGhpc30KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIENvbW1pdENvbW1hbmQgc2V0Q29tbWVudENoYXJhY3RlcihDaGFyYWN0ZXIgY29tbWVudENoYXIpIHsKKwkJY2hlY2tDYWxsYWJsZSgpOworCQl0aGlzLmNvbW1lbnRDaGFyID0gY29tbWVudENoYXI7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgogCSAqIFNldCB3aGV0aGVyIHRvIGFsbG93IHRvIGNyZWF0ZSBhbiBlbXB0eSBjb21taXQKIAkgKgogCSAqIEBwYXJhbSBhbGxvd0VtcHR5CkBAIC04MDYsNyArODc5LDcgQEAgcHVibGljIENvbW1pdENvbW1hbmQgc2V0QWxsKGJvb2xlYW4gYWxsKSB7CiAJICogY29tbWFuZCBsaW5lLgogCSAqCiAJICogQHBhcmFtIGFtZW5kCi0JICogICAgICAgICAgICB3aGV0aGVyIHRvIGFtbWVuZCB0aGUgdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaAorCSAqICAgICAgICAgICAgd2hldGhlciB0byBhbWVuZCB0aGUgdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaAogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCiAJcHVibGljIENvbW1pdENvbW1hbmQgc2V0QW1lbmQoYm9vbGVhbiBhbWVuZCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmQuamF2YQppbmRleCAxZTUyNGZhLi44MDVhODg2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmQuamF2YQpAQCAtMTEsNiArMTEsNyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX1JFRlM7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX1RBR1M7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlR5cGVkQ29uZmlnR2V0dGVyLlVOU0VUX0lOVDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC0zMyw2ICszNCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2guRmlsZU5hbWVNYXRjaGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQWJicmV2Q29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CkBAIC04OSw2ICs5MSwxMSBAQCBwdWJsaWMgY2xhc3MgRGVzY3JpYmVDb21tYW5kIGV4dGVuZHMgR2l0Q29tbWFuZDxTdHJpbmc+IHsKIAlwcml2YXRlIGJvb2xlYW4gYWx3YXlzOwogCiAJLyoqCisJICogVGhlIHByZWZpeCBsZW5ndGggdG8gdXNlIHdoZW4gYWJicmV2aWF0aW5nIGEgY29tbWl0IGhhc2guCisJICovCisJcHJpdmF0ZSBpbnQgYWJicmV2ID0gVU5TRVRfSU5UOworCisJLyoqCiAJICogQ29uc3RydWN0b3IgZm9yIERlc2NyaWJlQ29tbWFuZC4KIAkgKgogCSAqIEBwYXJhbSByZXBvCkBAIC0yMDUsMTIgKzIxMiwzMyBAQCBwdWJsaWMgRGVzY3JpYmVDb21tYW5kIHNldEFsd2F5cyhib29sZWFuIGFsd2F5cykgewogCQlyZXR1cm4gdGhpczsKIAl9CiAKKwkvKioKKwkgKiBTZXRzIHRoZSBwcmVmaXggbGVuZ3RoIHRvIHVzZSB3aGVuIGFiYnJldmlhdGluZyBhbiBvYmplY3QgU0hBLTEuCisJICoKKwkgKiBAcGFyYW0gYWJicmV2CisJICogICAgICAgICAgICBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgYWJicmV2aWF0ZWQgc3RyaW5nLiBNdXN0IGJlIGluIHRoZSByYW5nZQorCSAqICAgICAgICAgICAgW3tAdmFsdWUgQWJicmV2Q29uZmlnI01JTl9BQkJSRVZ9LAorCSAqICAgICAgICAgICAge0B2YWx1ZSBDb25zdGFudHMjT0JKRUNUX0lEX1NUUklOR19MRU5HVEh9XS4KKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgRGVzY3JpYmVDb21tYW5kIHNldEFiYnJldihpbnQgYWJicmV2KSB7CisJCWlmIChhYmJyZXYgPT0gMCkgeworCQkJdGhpcy5hYmJyZXYgPSAwOworCQl9IGVsc2UgeworCQkJdGhpcy5hYmJyZXYgPSBBYmJyZXZDb25maWcuY2FwQWJicmV2KGFiYnJldik7CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfQorCiAJcHJpdmF0ZSBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uKFJlZiB0YWcsIGludCBkZXB0aCwgT2JqZWN0SWQgdGlwKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0cmluZy5mb3JtYXQoCi0JCQkJIiVzLSVkLWclcyIsIGZvcm1hdFJlZk5hbWUodGFnLmdldE5hbWUoKSksIC8vJE5PTi1OTFMtMSQKLQkJCQlJbnRlZ2VyLnZhbHVlT2YoZGVwdGgpLCB3LmdldE9iamVjdFJlYWRlcigpLmFiYnJldmlhdGUodGlwKQotCQkJCQkJLm5hbWUoKSk7CisJCWlmIChhYmJyZXYgPT0gMCkgeworCQkJcmV0dXJuIGZvcm1hdFJlZk5hbWUodGFnLmdldE5hbWUoKSk7CisJCX0KKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzLSVkLWclcyIsIGZvcm1hdFJlZk5hbWUodGFnLmdldE5hbWUoKSksIC8vJE5PTi1OTFMtMSQKKwkJCQlJbnRlZ2VyLnZhbHVlT2YoZGVwdGgpLAorCQkJCXcuZ2V0T2JqZWN0UmVhZGVyKCkuYWJicmV2aWF0ZSh0aXAsIGFiYnJldikubmFtZSgpKTsKIAl9CiAKIAkvKioKQEAgLTMwMiw2ICszMzAsOSBAQCBwdWJsaWMgU3RyaW5nIGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKIAkJCWlmICh0YXJnZXQgPT0gbnVsbCkgewogCQkJCXNldFRhcmdldChDb25zdGFudHMuSEVBRCk7CiAJCQl9CisJCQlpZiAoYWJicmV2ID09IFVOU0VUX0lOVCkgeworCQkJCWFiYnJldiA9IEFiYnJldkNvbmZpZy5wYXJzZUZyb21Db25maWcocmVwbykuZ2V0KCk7CisJCQl9CiAKIAkJCUNvbGxlY3Rpb248UmVmPiB0YWdMaXN0ID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpCiAJCQkJCS5nZXRSZWZzQnlQcmVmaXgodXNlQWxsID8gUl9SRUZTIDogUl9UQUdTKTsKQEAgLTQxMyw3ICs0NDQsMTIgQEAgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIHRpcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCQkJLy8gaWYgYWxsIHRoZSBub2RlcyBhcmUgZG9taW5hdGVkIGJ5IGFsbCB0aGUgdGFncywgdGhlIHdhbGsgc3RvcHMKIAkJCWlmIChjYW5kaWRhdGVzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBhbHdheXMgPyB3LmdldE9iamVjdFJlYWRlcigpLmFiYnJldmlhdGUodGFyZ2V0KS5uYW1lKCkgOiBudWxsOworCQkJCXJldHVybiBhbHdheXMKKwkJCQkJCT8gdy5nZXRPYmplY3RSZWFkZXIoKQorCQkJCQkJCQkuYWJicmV2aWF0ZSh0YXJnZXQsCisJCQkJCQkJCQkJQWJicmV2Q29uZmlnLmNhcEFiYnJldihhYmJyZXYpKQorCQkJCQkJCQkubmFtZSgpCisJCQkJCQk6IG51bGw7CiAJCQl9CiAKIAkJCUNhbmRpZGF0ZSBiZXN0ID0gQ29sbGVjdGlvbnMubWluKGNhbmRpZGF0ZXMsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZC5qYXZhCmluZGV4IGVmNTZkODAuLmNlMDY4YjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZC5qYXZhCkBAIC00MDUsNyArNDA1LDcgQEAgcHVibGljIE1lcmdlUmVzdWx0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBOb0hlYWRFeGNlcHRpb24sCiAJCQkJCQkJZmFpbGluZ1BhdGhzLCBudWxsKTsKIAkJCQl9CiAJCQkJU3RyaW5nIG1lcmdlTWVzc2FnZVdpdGhDb25mbGljdHMgPSBuZXcgTWVyZ2VNZXNzYWdlRm9ybWF0dGVyKCkKLQkJCQkJCS5mb3JtYXRXaXRoQ29uZmxpY3RzKG1lcmdlTWVzc2FnZSwgdW5tZXJnZWRQYXRocyk7CisJCQkJCQkuZm9ybWF0V2l0aENvbmZsaWN0cyhtZXJnZU1lc3NhZ2UsIHVubWVyZ2VkUGF0aHMsICcjJyk7CiAJCQkJcmVwby53cml0ZU1lcmdlQ29tbWl0TXNnKG1lcmdlTWVzc2FnZVdpdGhDb25mbGljdHMpOwogCQkJCXJldHVybiBuZXcgTWVyZ2VSZXN1bHQobnVsbCwgbWVyZ2VyLmdldEJhc2VDb21taXRJZCgpLAogCQkJCQkJbmV3IE9iamVjdElkW10geyBoZWFkQ29tbWl0LmdldElkKCksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YQppbmRleCBhYTVhNjM0Li4wODM1M2RmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEwLCBDaHJpcyBBbmlzemN6eWsgPGNhbmlzemN6eWtAZ21haWwuY29tPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMjIgQ2hyaXMgQW5pc3pjenlrIDxjYW5pc3pjenlrQGdtYWlsLmNvbT4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtMjEsNyArMjEsOSBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuRGV0YWNoZWRIZWFkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkludmFsaWRSZWZOYW1lRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5JbnZhbGlkUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5KR2l0SW50ZXJuYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm90U3VwcG9ydGVkRXhjZXB0aW9uOwpAQCAtMjksMTEgKzMxLDE2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVG9vTGFyZ2VQYWNrRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkJyYW5jaENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5OdWxsUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hDb25maWcuUHVzaERlZmF1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUHVzaFJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZMZWFzZVNwZWM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmU3BlYzsKQEAgLTUyLDcgKzU5LDcgQEAKIHB1YmxpYyBjbGFzcyBQdXNoQ29tbWFuZCBleHRlbmRzCiAJCVRyYW5zcG9ydENvbW1hbmQ8UHVzaENvbW1hbmQsIEl0ZXJhYmxlPFB1c2hSZXN1bHQ+PiB7CiAKLQlwcml2YXRlIFN0cmluZyByZW1vdGUgPSBDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRTsKKwlwcml2YXRlIFN0cmluZyByZW1vdGU7CiAKIAlwcml2YXRlIGZpbmFsIExpc3Q8UmVmU3BlYz4gcmVmU3BlY3M7CiAKQEAgLTcxLDYgKzc4LDEwIEBAIHB1YmxpYyBjbGFzcyBQdXNoQ29tbWFuZCBleHRlbmRzCiAKIAlwcml2YXRlIExpc3Q8U3RyaW5nPiBwdXNoT3B0aW9uczsKIAorCS8vIExlZ2FjeSBiZWhhdmlvciBhcyBkZWZhdWx0LiBVc2Ugc2V0UHVzaERlZmF1bHQobnVsbCkgdG8gZGV0ZXJtaW5lIHRoZQorCS8vIHZhbHVlIGZyb20gdGhlIGdpdCBjb25maWcuCisJcHJpdmF0ZSBQdXNoRGVmYXVsdCBwdXNoRGVmYXVsdCA9IFB1c2hEZWZhdWx0LkNVUlJFTlQ7CisKIAkvKioKIAkgKiA8cD4KIAkgKiBDb25zdHJ1Y3RvciBmb3IgUHVzaENvbW1hbmQuCkBAIC05OCwxOSArMTA5LDIwIEBAIHB1YmxpYyBJdGVyYWJsZTxQdXNoUmVzdWx0PiBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwKIAkJCUludmFsaWRSZW1vdGVFeGNlcHRpb24sCiAJCQlvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJY2hlY2tDYWxsYWJsZSgpOworCQlzZXRDYWxsYWJsZShmYWxzZSk7CiAKIAkJQXJyYXlMaXN0PFB1c2hSZXN1bHQ+IHB1c2hSZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KDMpOwogCiAJCXRyeSB7CisJCQlDb25maWcgY29uZmlnID0gcmVwby5nZXRDb25maWcoKTsKKwkJCXJlbW90ZSA9IGRldGVybWluZVJlbW90ZShjb25maWcsIHJlbW90ZSk7CiAJCQlpZiAocmVmU3BlY3MuaXNFbXB0eSgpKSB7Ci0JCQkJUmVtb3RlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZW1vdGVDb25maWcocmVwby5nZXRDb25maWcoKSwKKwkJCQlSZW1vdGVDb25maWcgcmMgPSBuZXcgUmVtb3RlQ29uZmlnKGNvbmZpZywKIAkJCQkJCWdldFJlbW90ZSgpKTsKLQkJCQlyZWZTcGVjcy5hZGRBbGwoY29uZmlnLmdldFB1c2hSZWZTcGVjcygpKTsKLQkJCX0KLQkJCWlmIChyZWZTcGVjcy5pc0VtcHR5KCkpIHsKLQkJCQlSZWYgaGVhZCA9IHJlcG8uZXhhY3RSZWYoQ29uc3RhbnRzLkhFQUQpOwotCQkJCWlmIChoZWFkICE9IG51bGwgJiYgaGVhZC5pc1N5bWJvbGljKCkpCi0JCQkJCXJlZlNwZWNzLmFkZChuZXcgUmVmU3BlYyhoZWFkLmdldExlYWYoKS5nZXROYW1lKCkpKTsKKwkJCQlyZWZTcGVjcy5hZGRBbGwocmMuZ2V0UHVzaFJlZlNwZWNzKCkpOworCQkJCWlmIChyZWZTcGVjcy5pc0VtcHR5KCkpIHsKKwkJCQkJZGV0ZXJtaW5lRGVmYXVsdFJlZlNwZWNzKGNvbmZpZyk7CisJCQkJfQogCQkJfQogCiAJCQlpZiAoZm9yY2UpIHsKQEAgLTExOCw4ICsxMzAsOCBAQCBwdWJsaWMgSXRlcmFibGU8UHVzaFJlc3VsdD4gY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sCiAJCQkJCXJlZlNwZWNzLnNldChpLCByZWZTcGVjcy5nZXQoaSkuc2V0Rm9yY2VVcGRhdGUodHJ1ZSkpOwogCQkJfQogCi0JCQlmaW5hbCBMaXN0PFRyYW5zcG9ydD4gdHJhbnNwb3J0czsKLQkJCXRyYW5zcG9ydHMgPSBUcmFuc3BvcnQub3BlbkFsbChyZXBvLCByZW1vdGUsIFRyYW5zcG9ydC5PcGVyYXRpb24uUFVTSCk7CisJCQlMaXN0PFRyYW5zcG9ydD4gdHJhbnNwb3J0cyA9IFRyYW5zcG9ydC5vcGVuQWxsKHJlcG8sIHJlbW90ZSwKKwkJCQkJVHJhbnNwb3J0Lk9wZXJhdGlvbi5QVVNIKTsKIAkJCWZvciAoQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gRXhwbGljaXRseSBjbG9zZWQgaW4gZmluYWxseQogCQkJCQlmaW5hbCBUcmFuc3BvcnQgdHJhbnNwb3J0IDogdHJhbnNwb3J0cykgewogCQkJCXRyYW5zcG9ydC5zZXRQdXNoVGhpbih0aGluKTsKQEAgLTE3MSw2ICsxODMsMTAyIEBAIHB1YmxpYyBJdGVyYWJsZTxQdXNoUmVzdWx0PiBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwKIAkJcmV0dXJuIHB1c2hSZXN1bHRzOwogCX0KIAorCXByaXZhdGUgU3RyaW5nIGRldGVybWluZVJlbW90ZShDb25maWcgY29uZmlnLCBTdHJpbmcgcmVtb3RlTmFtZSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChyZW1vdGVOYW1lICE9IG51bGwpIHsKKwkJCXJldHVybiByZW1vdGVOYW1lOworCQl9CisJCVJlZiBoZWFkID0gcmVwby5leGFjdFJlZihDb25zdGFudHMuSEVBRCk7CisJCVN0cmluZyBlZmZlY3RpdmVSZW1vdGUgPSBudWxsOworCQlCcmFuY2hDb25maWcgYnJhbmNoQ2ZnID0gbnVsbDsKKwkJaWYgKGhlYWQgIT0gbnVsbCAmJiBoZWFkLmlzU3ltYm9saWMoKSkgeworCQkJU3RyaW5nIGN1cnJlbnRCcmFuY2ggPSBoZWFkLmdldExlYWYoKS5nZXROYW1lKCk7CisJCQlicmFuY2hDZmcgPSBuZXcgQnJhbmNoQ29uZmlnKGNvbmZpZywKKwkJCQkJUmVwb3NpdG9yeS5zaG9ydGVuUmVmTmFtZShjdXJyZW50QnJhbmNoKSk7CisJCQllZmZlY3RpdmVSZW1vdGUgPSBicmFuY2hDZmcuZ2V0UHVzaFJlbW90ZSgpOworCQl9CisJCWlmIChlZmZlY3RpdmVSZW1vdGUgPT0gbnVsbCkgeworCQkJZWZmZWN0aXZlUmVtb3RlID0gY29uZmlnLmdldFN0cmluZygKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwgbnVsbCwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUFVTSF9ERUZBVUxUKTsKKwkJCWlmIChlZmZlY3RpdmVSZW1vdGUgPT0gbnVsbCAmJiBicmFuY2hDZmcgIT0gbnVsbCkgeworCQkJCWVmZmVjdGl2ZVJlbW90ZSA9IGJyYW5jaENmZy5nZXRSZW1vdGUoKTsKKwkJCX0KKwkJfQorCQlpZiAoZWZmZWN0aXZlUmVtb3RlID09IG51bGwpIHsKKwkJCWVmZmVjdGl2ZVJlbW90ZSA9IENvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FOworCQl9CisJCXJldHVybiBlZmZlY3RpdmVSZW1vdGU7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q3VycmVudEJyYW5jaCgpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIERldGFjaGVkSGVhZEV4Y2VwdGlvbiB7CisJCVJlZiBoZWFkID0gcmVwby5leGFjdFJlZihDb25zdGFudHMuSEVBRCk7CisJCWlmIChoZWFkICE9IG51bGwgJiYgaGVhZC5pc1N5bWJvbGljKCkpIHsKKwkJCXJldHVybiBoZWFkLmdldExlYWYoKS5nZXROYW1lKCk7CisJCX0KKwkJdGhyb3cgbmV3IERldGFjaGVkSGVhZEV4Y2VwdGlvbigpOworCX0KKworCXByaXZhdGUgdm9pZCBkZXRlcm1pbmVEZWZhdWx0UmVmU3BlY3MoQ29uZmlnIGNvbmZpZykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW9uIHsKKwkJaWYgKHB1c2hEZWZhdWx0ID09IG51bGwpIHsKKwkJCXB1c2hEZWZhdWx0ID0gY29uZmlnLmdldChQdXNoQ29uZmlnOjpuZXcpLmdldFB1c2hEZWZhdWx0KCk7CisJCX0KKwkJc3dpdGNoIChwdXNoRGVmYXVsdCkgeworCQljYXNlIENVUlJFTlQ6CisJCQlyZWZTcGVjcy5hZGQobmV3IFJlZlNwZWMoZ2V0Q3VycmVudEJyYW5jaCgpKSk7CisJCQlicmVhazsKKwkJY2FzZSBNQVRDSElORzoKKwkJCXJlZlNwZWNzLmFkZChuZXcgUmVmU3BlYygiOiIpKTsgLy8kTk9OLU5MUy0xJAorCQkJYnJlYWs7CisJCWNhc2UgTk9USElORzoKKwkJCXRocm93IG5ldyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbigKKwkJCQkJSkdpdFRleHQuZ2V0KCkucHVzaERlZmF1bHROb3RoaW5nKTsKKwkJY2FzZSBTSU1QTEU6CisJCWNhc2UgVVBTVFJFQU06CisJCQlTdHJpbmcgY3VycmVudEJyYW5jaCA9IGdldEN1cnJlbnRCcmFuY2goKTsKKwkJCUJyYW5jaENvbmZpZyBicmFuY2hDZmcgPSBuZXcgQnJhbmNoQ29uZmlnKGNvbmZpZywKKwkJCQkJUmVwb3NpdG9yeS5zaG9ydGVuUmVmTmFtZShjdXJyZW50QnJhbmNoKSk7CisJCQlTdHJpbmcgZmV0Y2hSZW1vdGUgPSBicmFuY2hDZmcuZ2V0UmVtb3RlKCk7CisJCQlpZiAoZmV0Y2hSZW1vdGUgPT0gbnVsbCkgeworCQkJCWZldGNoUmVtb3RlID0gQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUU7CisJCQl9CisJCQlib29sZWFuIGlzVHJpYW5ndWxhciA9ICFmZXRjaFJlbW90ZS5lcXVhbHMocmVtb3RlKTsKKwkJCWlmIChpc1RyaWFuZ3VsYXIpIHsKKwkJCQlpZiAoUHVzaERlZmF1bHQuVVBTVFJFQU0uZXF1YWxzKHB1c2hEZWZhdWx0KSkgeworCQkJCQl0aHJvdyBuZXcgSW52YWxpZFJlZk5hbWVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkucHVzaERlZmF1bHRUcmlhbmd1bGFyVXBzdHJlYW0sCisJCQkJCQkJcmVtb3RlLCBmZXRjaFJlbW90ZSkpOworCQkJCX0KKwkJCQkvLyBTdHJhbmdlLCBidXQgY29uc2lzdGVudCB3aXRoIEMgZ2l0OiAic2ltcGxlIiBkb2Vzbid0IGV2ZW4KKwkJCQkvLyBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgY29uZmlndXJlZCB1cHN0cmVhbSwgYW5kIGlmIHNvLCB0aGF0CisJCQkJLy8gaXQgaXMgZXF1YWwgdG8gdGhlIGxvY2FsIGJyYW5jaCBuYW1lLiBJdCBqdXN0IGJlY29tZXMKKwkJCQkvLyAiY3VycmVudCIuCisJCQkJcmVmU3BlY3MuYWRkKG5ldyBSZWZTcGVjKGN1cnJlbnRCcmFuY2gpKTsKKwkJCX0gZWxzZSB7CisJCQkJU3RyaW5nIHRyYWNrZWRCcmFuY2ggPSBicmFuY2hDZmcuZ2V0TWVyZ2UoKTsKKwkJCQlpZiAoYnJhbmNoQ2ZnLmlzUmVtb3RlTG9jYWwoKSB8fCB0cmFja2VkQnJhbmNoID09IG51bGwKKwkJCQkJCXx8ICF0cmFja2VkQnJhbmNoLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKSB7CisJCQkJCXRocm93IG5ldyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQlKR2l0VGV4dC5nZXQoKS5wdXNoRGVmYXVsdE5vVXBzdHJlYW0sCisJCQkJCQkJY3VycmVudEJyYW5jaCkpOworCQkJCX0KKwkJCQlpZiAoUHVzaERlZmF1bHQuU0lNUExFLmVxdWFscyhwdXNoRGVmYXVsdCkKKwkJCQkJCSYmICF0cmFja2VkQnJhbmNoLmVxdWFscyhjdXJyZW50QnJhbmNoKSkgeworCQkJCQl0aHJvdyBuZXcgSW52YWxpZFJlZk5hbWVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkucHVzaERlZmF1bHRTaW1wbGUsIGN1cnJlbnRCcmFuY2gsCisJCQkJCQkJdHJhY2tlZEJyYW5jaCkpOworCQkJCX0KKwkJCQlyZWZTcGVjcy5hZGQobmV3IFJlZlNwZWMoY3VycmVudEJyYW5jaCArICc6JyArIHRyYWNrZWRCcmFuY2gpKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGhyb3cgbmV3IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5wdXNoRGVmYXVsdFVua25vd24sIHB1c2hEZWZhdWx0KSk7CisJCX0KKwl9CisKIAkvKioKIAkgKiBUaGUgcmVtb3RlICh1cmkgb3IgbmFtZSkgdXNlZCBmb3IgdGhlIHB1c2ggb3BlcmF0aW9uLiBJZiBubyByZW1vdGUgaXMKIAkgKiBzZXQsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIDxjb2RlPkNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FPC9jb2RlPiB3aWxsCkBAIC0zMzYsOSArNDQ0LDM3IEBAIHB1YmxpYyBQdXNoQ29tbWFuZCBzZXRSZWZTcGVjcyhMaXN0PFJlZlNwZWM+IHNwZWNzKSB7CiAJfQogCiAJLyoqCisJICogUmV0cmlldmVzIHRoZSB7QGxpbmsgUHVzaERlZmF1bHR9IGN1cnJlbnRseSBzZXQuCisJICoKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgUHVzaERlZmF1bHR9LCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IHNldAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgUHVzaERlZmF1bHQgZ2V0UHVzaERlZmF1bHQoKSB7CisJCXJldHVybiBwdXNoRGVmYXVsdDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIGFuIGV4cGxpY2l0IHtAbGluayBQdXNoRGVmYXVsdH0uIFRoZSBkZWZhdWx0IHVzZWQgaWYgdGhpcyBpcyBub3QKKwkgKiBjYWxsZWQgaXMge0BsaW5rIFB1c2hEZWZhdWx0I0NVUlJFTlR9IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2l0aAorCSAqIGVhcmxpZXIgSkdpdCB2ZXJzaW9ucy4KKwkgKgorCSAqIEBwYXJhbSBwdXNoRGVmYXVsdAorCSAqICAgICAgICAgICAge0BsaW5rIFB1c2hEZWZhdWx0fSB0byBzZXQ7IGlmIHtAY29kZSBudWxsfSB0aGUgdmFsdWUgZGVmaW5lZAorCSAqICAgICAgICAgICAgaW4gdGhlIGdpdCBjb25maWcgd2lsbCBiZSB1c2VkLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgdGhpc30KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFB1c2hDb21tYW5kIHNldFB1c2hEZWZhdWx0KFB1c2hEZWZhdWx0IHB1c2hEZWZhdWx0KSB7CisJCWNoZWNrQ2FsbGFibGUoKTsKKwkJdGhpcy5wdXNoRGVmYXVsdCA9IHB1c2hEZWZhdWx0OworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKIAkgKiBQdXNoIGFsbCBicmFuY2hlcyB1bmRlciByZWZzL2hlYWRzLyouCiAJICoKLQkgKiBAcmV0dXJuIHtjb2RlIHRoaXN9CisJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KIAlwdWJsaWMgUHVzaENvbW1hbmQgc2V0UHVzaEFsbCgpIHsKIAkJcmVmU3BlY3MuYWRkKFRyYW5zcG9ydC5SRUZTUEVDX1BVU0hfQUxMKTsKQEAgLTM0OCw3ICs0ODQsNyBAQCBwdWJsaWMgUHVzaENvbW1hbmQgc2V0UHVzaEFsbCgpIHsKIAkvKioKIAkgKiBQdXNoIGFsbCB0YWdzIHVuZGVyIHJlZnMvdGFncy8qLgogCSAqCi0JICogQHJldHVybiB7Y29kZSB0aGlzfQorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCiAJcHVibGljIFB1c2hDb21tYW5kIHNldFB1c2hUYWdzKCkgewogCQlyZWZTcGVjcy5hZGQoVHJhbnNwb3J0LlJFRlNQRUNfVEFHUyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kLmphdmEKaW5kZXggYTI2ZmZjMi4uMmIwZDhjZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlJlYmFzZVJlc3VsdC5TdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuUmVzZXRDb21tYW5kLlJlc2V0VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQ2hlY2tvdXRDb25mbGljdEV4Y2VwdGlvbjsKQEAgLTUyLDYgKzUzLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFiYnJldmlhdGVkT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0Q29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdENvbmZpZy5DbGVhbnVwTW9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk51bGxQcm9ncmVzc01vbml0b3I7CkBAIC0yMDUsNiArMjA4LDggQEAgcHVibGljIGVudW0gT3BlcmF0aW9uIHsKIAogCXByaXZhdGUgSW50ZXJhY3RpdmVIYW5kbGVyIGludGVyYWN0aXZlSGFuZGxlcjsKIAorCXByaXZhdGUgQ29tbWl0Q29uZmlnIGNvbW1pdENvbmZpZzsKKwogCXByaXZhdGUgYm9vbGVhbiBzdG9wQWZ0ZXJJbml0aWFsaXphdGlvbiA9IGZhbHNlOwogCiAJcHJpdmF0ZSBSZXZDb21taXQgbmV3SGVhZDsKQEAgLTI0Niw2ICsyNTEsNyBAQCBwdWJsaWMgUmViYXNlUmVzdWx0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBOb0hlYWRFeGNlcHRpb24sCiAJCWxhc3RTdGVwV2FzRm9yd2FyZCA9IGZhbHNlOwogCQljaGVja0NhbGxhYmxlKCk7CiAJCWNoZWNrUGFyYW1ldGVycygpOworCQljb21taXRDb25maWcgPSByZXBvLmdldENvbmZpZygpLmdldChDb21taXRDb25maWcuS0VZKTsKIAkJdHJ5IHsKIAkJCXN3aXRjaCAob3BlcmF0aW9uKSB7CiAJCQljYXNlIEFCT1JUOgpAQCAtNDQxLDExICs0NDcsMTYgQEAgcHJpdmF0ZSBSZWJhc2VSZXN1bHQgcHJvY2Vzc1N0ZXAoUmViYXNlVG9kb0xpbmUgc3RlcCwgYm9vbGVhbiBzaG91bGRQaWNrKQogCQkJcmV0dXJuIG51bGw7IC8vIGNvbnRpbnVlIHJlYmFzZSBwcm9jZXNzIG9uIHBpY2sgY29tbWFuZAogCQljYXNlIFJFV09SRDoKIAkJCVN0cmluZyBvbGRNZXNzYWdlID0gY29tbWl0VG9QaWNrLmdldEZ1bGxNZXNzYWdlKCk7Ci0JCQlTdHJpbmcgbmV3TWVzc2FnZSA9IGludGVyYWN0aXZlSGFuZGxlcgotCQkJCQkubW9kaWZ5Q29tbWl0TWVzc2FnZShvbGRNZXNzYWdlKTsKKwkJCUNsZWFudXBNb2RlIG1vZGUgPSBjb21taXRDb25maWcucmVzb2x2ZShDbGVhbnVwTW9kZS5ERUZBVUxULCB0cnVlKTsKKwkJCWJvb2xlYW5bXSBkb0NoYW5nZUlkID0geyBmYWxzZSB9OworCQkJU3RyaW5nIG5ld01lc3NhZ2UgPSBlZGl0Q29tbWl0TWVzc2FnZShkb0NoYW5nZUlkLCBvbGRNZXNzYWdlLCBtb2RlKTsKIAkJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQocmVwbykpIHsKLQkJCQluZXdIZWFkID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UobmV3TWVzc2FnZSkuc2V0QW1lbmQodHJ1ZSkKLQkJCQkJCS5zZXROb1ZlcmlmeSh0cnVlKS5jYWxsKCk7CisJCQkJbmV3SGVhZCA9IGdpdC5jb21taXQoKQorCQkJCQkJLnNldE1lc3NhZ2UobmV3TWVzc2FnZSkKKwkJCQkJCS5zZXRBbWVuZCh0cnVlKQorCQkJCQkJLnNldE5vVmVyaWZ5KHRydWUpCisJCQkJCQkuc2V0SW5zZXJ0Q2hhbmdlSWQoZG9DaGFuZ2VJZFswXSkKKwkJCQkJCS5jYWxsKCk7CiAJCQl9CiAJCQlyZXR1cm4gbnVsbDsKIAkJY2FzZSBFRElUOgpAQCAtNDYwLDE3ICs0NzEsNDkgQEAgcHJpdmF0ZSBSZWJhc2VSZXN1bHQgcHJvY2Vzc1N0ZXAoUmViYXNlVG9kb0xpbmUgc3RlcCwgYm9vbGVhbiBzaG91bGRQaWNrKQogCQkJcmVzZXRTb2Z0VG9QYXJlbnQoKTsKIAkJCUxpc3Q8UmViYXNlVG9kb0xpbmU+IHN0ZXBzID0gcmVwby5yZWFkUmViYXNlVG9kbygKIAkJCQkJcmViYXNlU3RhdGUuZ2V0UGF0aChHSVRfUkVCQVNFX1RPRE8pLCBmYWxzZSk7Ci0JCQlSZWJhc2VUb2RvTGluZSBuZXh0U3RlcCA9IHN0ZXBzLmlzRW1wdHkoKSA/IG51bGwgOiBzdGVwcy5nZXQoMCk7CisJCQlib29sZWFuIGlzTGFzdCA9IHN0ZXBzLmlzRW1wdHkoKTsKKwkJCWlmICghaXNMYXN0KSB7CisJCQkJc3dpdGNoIChzdGVwcy5nZXQoMCkuZ2V0QWN0aW9uKCkpIHsKKwkJCQljYXNlIEZJWFVQOgorCQkJCWNhc2UgU1FVQVNIOgorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlpc0xhc3QgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CiAJCQlGaWxlIG1lc3NhZ2VGaXh1cEZpbGUgPSByZWJhc2VTdGF0ZS5nZXRGaWxlKE1FU1NBR0VfRklYVVApOwogCQkJRmlsZSBtZXNzYWdlU3F1YXNoRmlsZSA9IHJlYmFzZVN0YXRlLmdldEZpbGUoTUVTU0FHRV9TUVVBU0gpOwotCQkJaWYgKGlzU3F1YXNoICYmIG1lc3NhZ2VGaXh1cEZpbGUuZXhpc3RzKCkpCisJCQlpZiAoaXNTcXVhc2ggJiYgbWVzc2FnZUZpeHVwRmlsZS5leGlzdHMoKSkgewogCQkJCW1lc3NhZ2VGaXh1cEZpbGUuZGVsZXRlKCk7Ci0JCQluZXdIZWFkID0gZG9TcXVhc2hGaXh1cChpc1NxdWFzaCwgY29tbWl0VG9QaWNrLCBuZXh0U3RlcCwKKwkJCX0KKwkJCW5ld0hlYWQgPSBkb1NxdWFzaEZpeHVwKGlzU3F1YXNoLCBjb21taXRUb1BpY2ssIGlzTGFzdCwKIAkJCQkJbWVzc2FnZUZpeHVwRmlsZSwgbWVzc2FnZVNxdWFzaEZpbGUpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KIAorCXByaXZhdGUgU3RyaW5nIGVkaXRDb21taXRNZXNzYWdlKGJvb2xlYW5bXSBkb0NoYW5nZUlkLCBTdHJpbmcgbWVzc2FnZSwKKwkJCUBOb25OdWxsIENsZWFudXBNb2RlIG1vZGUpIHsKKwkJU3RyaW5nIG5ld01lc3NhZ2U7CisJCUNvbW1pdENvbmZpZy5DbGVhbnVwTW9kZSBjbGVhbnVwOworCQlpZiAoaW50ZXJhY3RpdmVIYW5kbGVyIGluc3RhbmNlb2YgSW50ZXJhY3RpdmVIYW5kbGVyMikgeworCQkJSW50ZXJhY3RpdmVIYW5kbGVyMi5Nb2RpZnlSZXN1bHQgbW9kaWZpY2F0aW9uID0gKChJbnRlcmFjdGl2ZUhhbmRsZXIyKSBpbnRlcmFjdGl2ZUhhbmRsZXIpCisJCQkJCS5lZGl0Q29tbWl0TWVzc2FnZShtZXNzYWdlLCBtb2RlLCAnIycpOworCQkJbmV3TWVzc2FnZSA9IG1vZGlmaWNhdGlvbi5nZXRNZXNzYWdlKCk7CisJCQljbGVhbnVwID0gbW9kaWZpY2F0aW9uLmdldENsZWFudXBNb2RlKCk7CisJCQlpZiAoQ2xlYW51cE1vZGUuREVGQVVMVC5lcXVhbHMoY2xlYW51cCkpIHsKKwkJCQljbGVhbnVwID0gbW9kZTsKKwkJCX0KKwkJCWRvQ2hhbmdlSWRbMF0gPSBtb2RpZmljYXRpb24uc2hvdWxkQWRkQ2hhbmdlSWQoKTsKKwkJfSBlbHNlIHsKKwkJCW5ld01lc3NhZ2UgPSBpbnRlcmFjdGl2ZUhhbmRsZXIubW9kaWZ5Q29tbWl0TWVzc2FnZShtZXNzYWdlKTsKKwkJCWNsZWFudXAgPSBDb21taXRDb25maWcuQ2xlYW51cE1vZGUuU1RSSVA7CisJCQlkb0NoYW5nZUlkWzBdID0gZmFsc2U7CisJCX0KKwkJcmV0dXJuIENvbW1pdENvbmZpZy5jbGVhblRleHQobmV3TWVzc2FnZSwgY2xlYW51cCwgJyMnKTsKKwl9CisKIAlwcml2YXRlIFJlYmFzZVJlc3VsdCBjaGVycnlQaWNrQ29tbWl0KFJldkNvbW1pdCBjb21taXRUb1BpY2spCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEdpdEFQSUV4Y2VwdGlvbiwgTm9NZXNzYWdlRXhjZXB0aW9uLAogCQkJVW5tZXJnZWRQYXRoc0V4Y2VwdGlvbiwgQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbiwKQEAgLTcwNyw3ICs3NTAsNyBAQCBwcml2YXRlIHZvaWQgY2hlY2tTdGVwcyhMaXN0PFJlYmFzZVRvZG9MaW5lPiBzdGVwcykKIAl9CiAKIAlwcml2YXRlIFJldkNvbW1pdCBkb1NxdWFzaEZpeHVwKGJvb2xlYW4gaXNTcXVhc2gsIFJldkNvbW1pdCBjb21taXRUb1BpY2ssCi0JCQlSZWJhc2VUb2RvTGluZSBuZXh0U3RlcCwgRmlsZSBtZXNzYWdlRml4dXAsIEZpbGUgbWVzc2FnZVNxdWFzaCkKKwkJCWJvb2xlYW4gaXNMYXN0LCBGaWxlIG1lc3NhZ2VGaXh1cCwgRmlsZSBtZXNzYWdlU3F1YXNoKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24gewogCiAJCWlmICghbWVzc2FnZVNxdWFzaC5leGlzdHMoKSkgewpAQCAtNzE3LDI0ICs3NjAsMjAgQEAgcHJpdmF0ZSBSZXZDb21taXQgZG9TcXVhc2hGaXh1cChib29sZWFuIGlzU3F1YXNoLCBSZXZDb21taXQgY29tbWl0VG9QaWNrLAogCiAJCQlpbml0aWFsaXplU3F1YXNoRml4dXBGaWxlKE1FU1NBR0VfU1FVQVNILAogCQkJCQlwcmV2aW91c0NvbW1pdC5nZXRGdWxsTWVzc2FnZSgpKTsKLQkJCWlmICghaXNTcXVhc2gpCi0JCQkJaW5pdGlhbGl6ZVNxdWFzaEZpeHVwRmlsZShNRVNTQUdFX0ZJWFVQLAotCQkJCQlwcmV2aW91c0NvbW1pdC5nZXRGdWxsTWVzc2FnZSgpKTsKKwkJCWlmICghaXNTcXVhc2gpIHsKKwkJCQlyZWJhc2VTdGF0ZS5jcmVhdGVGaWxlKE1FU1NBR0VfRklYVVAsCisJCQkJCQlwcmV2aW91c0NvbW1pdC5nZXRGdWxsTWVzc2FnZSgpKTsKKwkJCX0KIAkJfQotCQlTdHJpbmcgY3VyclNxdWFzaE1lc3NhZ2UgPSByZWJhc2VTdGF0ZQotCQkJCS5yZWFkRmlsZShNRVNTQUdFX1NRVUFTSCk7CisJCVN0cmluZyBjdXJyU3F1YXNoTWVzc2FnZSA9IHJlYmFzZVN0YXRlLnJlYWRGaWxlKE1FU1NBR0VfU1FVQVNIKTsKIAogCQlpbnQgY291bnQgPSBwYXJzZVNxdWFzaEZpeHVwU2VxdWVuY2VDb3VudChjdXJyU3F1YXNoTWVzc2FnZSkgKyAxOwogCiAJCVN0cmluZyBjb250ZW50ID0gY29tcG9zZVNxdWFzaE1lc3NhZ2UoaXNTcXVhc2gsCiAJCQkJY29tbWl0VG9QaWNrLCBjdXJyU3F1YXNoTWVzc2FnZSwgY291bnQpOwogCQlyZWJhc2VTdGF0ZS5jcmVhdGVGaWxlKE1FU1NBR0VfU1FVQVNILCBjb250ZW50KTsKLQkJaWYgKG1lc3NhZ2VGaXh1cC5leGlzdHMoKSkKLQkJCXJlYmFzZVN0YXRlLmNyZWF0ZUZpbGUoTUVTU0FHRV9GSVhVUCwgY29udGVudCk7CiAKLQkJcmV0dXJuIHNxdWFzaEludG9QcmV2aW91cygKLQkJCQkhbWVzc2FnZUZpeHVwLmV4aXN0cygpLAotCQkJCW5leHRTdGVwKTsKKwkJcmV0dXJuIHNxdWFzaEludG9QcmV2aW91cyghbWVzc2FnZUZpeHVwLmV4aXN0cygpLCBpc0xhc3QpOwogCX0KIAogCXByaXZhdGUgdm9pZCByZXNldFNvZnRUb1BhcmVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiwKQEAgLTc1NiwyNiArNzk1LDMwIEBAIHByaXZhdGUgdm9pZCByZXNldFNvZnRUb1BhcmVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiwKIAl9CiAKIAlwcml2YXRlIFJldkNvbW1pdCBzcXVhc2hJbnRvUHJldmlvdXMoYm9vbGVhbiBzZXF1ZW5jZUNvbnRhaW5zU3F1YXNoLAotCQkJUmViYXNlVG9kb0xpbmUgbmV4dFN0ZXApCisJCQlib29sZWFuIGlzTGFzdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW9uIHsKIAkJUmV2Q29tbWl0IHJldE5ld0hlYWQ7Ci0JCVN0cmluZyBjb21taXRNZXNzYWdlID0gcmViYXNlU3RhdGUKLQkJCQkucmVhZEZpbGUoTUVTU0FHRV9TUVVBU0gpOwotCisJCVN0cmluZyBjb21taXRNZXNzYWdlOworCQlpZiAoIWlzTGFzdCB8fCBzZXF1ZW5jZUNvbnRhaW5zU3F1YXNoKSB7CisJCQljb21taXRNZXNzYWdlID0gcmViYXNlU3RhdGUucmVhZEZpbGUoTUVTU0FHRV9TUVVBU0gpOworCQl9IGVsc2UgeworCQkJY29tbWl0TWVzc2FnZSA9IHJlYmFzZVN0YXRlLnJlYWRGaWxlKE1FU1NBR0VfRklYVVApOworCQl9CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQocmVwbykpIHsKLQkJCWlmIChuZXh0U3RlcCA9PSBudWxsIHx8ICgobmV4dFN0ZXAuZ2V0QWN0aW9uKCkgIT0gQWN0aW9uLkZJWFVQKQotCQkJCQkmJiAobmV4dFN0ZXAuZ2V0QWN0aW9uKCkgIT0gQWN0aW9uLlNRVUFTSCkpKSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgbGFzdCBzdGVwIGluIHRoaXMgc2VxdWVuY2UKKwkJCWlmIChpc0xhc3QpIHsKKwkJCQlib29sZWFuW10gZG9DaGFuZ2VJZCA9IHsgZmFsc2UgfTsKIAkJCQlpZiAoc2VxdWVuY2VDb250YWluc1NxdWFzaCkgewotCQkJCQljb21taXRNZXNzYWdlID0gaW50ZXJhY3RpdmVIYW5kbGVyCi0JCQkJCQkJLm1vZGlmeUNvbW1pdE1lc3NhZ2UoY29tbWl0TWVzc2FnZSk7CisJCQkJCWNvbW1pdE1lc3NhZ2UgPSBlZGl0Q29tbWl0TWVzc2FnZShkb0NoYW5nZUlkLCBjb21taXRNZXNzYWdlLAorCQkJCQkJCUNsZWFudXBNb2RlLlNUUklQKTsKIAkJCQl9CiAJCQkJcmV0TmV3SGVhZCA9IGdpdC5jb21taXQoKQotCQkJCQkJLnNldE1lc3NhZ2Uoc3RyaXBDb21tZW50TGluZXMoY29tbWl0TWVzc2FnZSkpCi0JCQkJCQkuc2V0QW1lbmQodHJ1ZSkuc2V0Tm9WZXJpZnkodHJ1ZSkuY2FsbCgpOworCQkJCQkJLnNldE1lc3NhZ2UoY29tbWl0TWVzc2FnZSkKKwkJCQkJCS5zZXRBbWVuZCh0cnVlKQorCQkJCQkJLnNldE5vVmVyaWZ5KHRydWUpCisJCQkJCQkuc2V0SW5zZXJ0Q2hhbmdlSWQoZG9DaGFuZ2VJZFswXSkKKwkJCQkJCS5jYWxsKCk7CiAJCQkJcmViYXNlU3RhdGUuZ2V0RmlsZShNRVNTQUdFX1NRVUFTSCkuZGVsZXRlKCk7CiAJCQkJcmViYXNlU3RhdGUuZ2V0RmlsZShNRVNTQUdFX0ZJWFVQKS5kZWxldGUoKTsKLQogCQkJfSBlbHNlIHsKIAkJCQkvLyBOZXh0IHN0ZXAgaXMgZWl0aGVyIFNxdWFzaCBvciBGaXh1cAogCQkJCXJldE5ld0hlYWQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShjb21taXRNZXNzYWdlKQpAQCAtNzg1LDIxICs4MjgsNiBAQCBwcml2YXRlIFJldkNvbW1pdCBzcXVhc2hJbnRvUHJldmlvdXMoYm9vbGVhbiBzZXF1ZW5jZUNvbnRhaW5zU3F1YXNoLAogCQlyZXR1cm4gcmV0TmV3SGVhZDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RyaXBDb21tZW50TGluZXMoU3RyaW5nIGNvbW1pdE1lc3NhZ2UpIHsKLQkJU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKFN0cmluZyBsaW5lIDogY29tbWl0TWVzc2FnZS5zcGxpdCgiXG4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIWxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoIiMiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQobGluZSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKCFjb21taXRNZXNzYWdlLmVuZHNXaXRoKCJcbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBidWZmZXJTaXplID0gcmVzdWx0Lmxlbmd0aCgpOwotCQkJaWYgKGJ1ZmZlclNpemUgPiAwICYmIHJlc3VsdC5jaGFyQXQoYnVmZmVyU2l6ZSAtIDEpID09ICdcbicpIHsKLQkJCQlyZXN1bHQuZGVsZXRlQ2hhckF0KGJ1ZmZlclNpemUgLSAxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCiAJQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCiAJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbXBvc2VTcXVhc2hNZXNzYWdlKGJvb2xlYW4gaXNTcXVhc2gsCiAJCQlSZXZDb21taXQgY29tbWl0VG9QaWNrLCBTdHJpbmcgY3VyclNxdWFzaE1lc3NhZ2UsIGludCBjb3VudCkgewpAQCAtMTYyNSwyNiArMTY1MywxMDYgQEAgcHVibGljIFJlYmFzZUNvbW1hbmQgc2V0UHJlc2VydmVNZXJnZXMoYm9vbGVhbiBwcmVzZXJ2ZSkgewogCX0KIAogCS8qKgotCSAqIEFsbG93cyBjb25maWd1cmUgcmViYXNlIGludGVyYWN0aXZlIHByb2Nlc3MgYW5kIG1vZGlmeSBjb21taXQgbWVzc2FnZQorCSAqIEFsbG93cyB0byBjb25maWd1cmUgdGhlIGludGVyYWN0aXZlIHJlYmFzZSBwcm9jZXNzIHN0ZXBzIGFuZCB0byBtb2RpZnkKKwkgKiBjb21taXQgbWVzc2FnZXMuCiAJICovCiAJcHVibGljIGludGVyZmFjZSBJbnRlcmFjdGl2ZUhhbmRsZXIgeworCiAJCS8qKgotCQkgKiBHaXZlbiBsaXN0IG9mIHtAY29kZSBzdGVwc30gc2hvdWxkIGJlIG1vZGlmaWVkIGFjY29yZGluZyB0byB1c2VyCi0JCSAqIHJlYmFzZSBjb25maWd1cmF0aW9uCisJCSAqIENhbGxiYWNrIEFQSSB0byBtb2RpZnkgdGhlIGluaXRpYWwgbGlzdCBvZiBpbnRlcmFjdGl2ZSByZWJhc2Ugc3RlcHMuCisJCSAqCiAJCSAqIEBwYXJhbSBzdGVwcwotCQkgKiAgICAgICAgICAgIGluaXRpYWwgY29uZmlndXJhdGlvbiBvZiByZWJhc2UgaW50ZXJhY3RpdmUKKwkJICogICAgICAgICAgICBpbml0aWFsIGNvbmZpZ3VyYXRpb24gb2YgaW50ZXJhY3RpdmUgcmViYXNlCiAJCSAqLwogCQl2b2lkIHByZXBhcmVTdGVwcyhMaXN0PFJlYmFzZVRvZG9MaW5lPiBzdGVwcyk7CiAKIAkJLyoqCi0JCSAqIFVzZWQgZm9yIGVkaXRpbmcgY29tbWl0IG1lc3NhZ2Ugb24gUkVXT1JECisJCSAqIFVzZWQgZm9yIGVkaXRpbmcgY29tbWl0IG1lc3NhZ2Ugb24gUkVXT1JEIG9yIFNRVUFTSC4KIAkJICoKLQkJICogQHBhcmFtIGNvbW1pdAorCQkgKiBAcGFyYW0gbWVzc2FnZQorCQkgKiAgICAgICAgICAgIGV4aXN0aW5nIGNvbW1pdCBtZXNzYWdlCiAJCSAqIEByZXR1cm4gbmV3IGNvbW1pdCBtZXNzYWdlCiAJCSAqLwotCQlTdHJpbmcgbW9kaWZ5Q29tbWl0TWVzc2FnZShTdHJpbmcgY29tbWl0KTsKKwkJU3RyaW5nIG1vZGlmeUNvbW1pdE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpOwogCX0KIAorCS8qKgorCSAqIEV4dGVuZHMge0BsaW5rIEludGVyYWN0aXZlSGFuZGxlcn0gd2l0aCBhbiBlbmhhbmNlZCBjYWxsYmFjayBmb3IgZWRpdGluZworCSAqIGNvbW1pdCBtZXNzYWdlcy4KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIEludGVyYWN0aXZlSGFuZGxlcjIgZXh0ZW5kcyBJbnRlcmFjdGl2ZUhhbmRsZXIgeworCisJCS8qKgorCQkgKiBDYWxsYmFjayBBUEkgZm9yIGVkaXRpbmcgYSBjb21taXQgbWVzc2FnZSBvbiBSRVdPUkQgb3IgU1FVQVNILgorCQkgKiA8cD4KKwkJICogVGhlIGNhbGxiYWNrIGdldHMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyIGN1cnJlbnRseSBzZXQsIGFuZCB0aGUKKwkJICogY2xlYW4tdXAgbW9kZS4gSXQgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHdoZW4gcHJlc2VudGluZyB0aGUKKwkJICogbWVzc2FnZSB0byB0aGUgdXNlciwgYW5kIGl0IGFsc28gaGFzIHRoZSBwb3NzaWJpbGl0eSB0byBjbGVhbiB0aGUKKwkJICogbWVzc2FnZSBpdHNlbGYgKGluIHdoaWNoIGNhc2UgdGhlIHJldHVybmVkIHtAbGluayBNb2RpZnlSZXN1bHR9CisJCSAqIHNob3VsZCBoYXZlIHtAbGluayBDbGVhbnVwTW9kZSNWRVJCQVRJTX0gc2V0IGxlc3QgSkdpdCBjbGVhbnMgdGhlCisJCSAqIG1lc3NhZ2UgYWdhaW4pLiBJdCBjYW4gYWxzbyBvdmVycmlkZSB0aGUgaW5pdGlhbCBjbGVhbi11cCBtb2RlIGJ5CisJCSAqIHJldHVybmluZyBjbGVhbi11cCBtb2RlIG90aGVyIHRoYW4ge0BsaW5rIENsZWFudXBNb2RlI0RFRkFVTFR9LiBJZiBpdAorCQkgKiBkb2VzIHJldHVybiB7QGNvZGUgREVGQVVMVH0sIHRoZSBwYXNzZWQtaW4ge0Bjb2RlIG1vZGV9IHdpbGwgYmUKKwkJICogYXBwbGllZC4KKwkJICogPC9wPgorCQkgKgorCQkgKiBAcGFyYW0gbWVzc2FnZQorCQkgKiAgICAgICAgICAgIGV4aXN0aW5nIGNvbW1pdCBtZXNzYWdlCisJCSAqIEBwYXJhbSBtb2RlCisJCSAqICAgICAgICAgICAge0BsaW5rIENsZWFudXBNb2RlfSBjdXJyZW50bHkgc2V0CisJCSAqIEBwYXJhbSBjb21tZW50Q2hhcgorCQkgKiAgICAgICAgICAgIGNvbW1lbnQgY2hhcmFjdGVyIHVzZWQKKwkJICogQHJldHVybiBhIHtAbGluayBNb2RpZnlSZXN1bHR9CisJCSAqLworCQlATm9uTnVsbAorCQlNb2RpZnlSZXN1bHQgZWRpdENvbW1pdE1lc3NhZ2UoQE5vbk51bGwgU3RyaW5nIG1lc3NhZ2UsCisJCQkJQE5vbk51bGwgQ2xlYW51cE1vZGUgbW9kZSwgY2hhciBjb21tZW50Q2hhcik7CisKKwkJQE92ZXJyaWRlCisJCWRlZmF1bHQgU3RyaW5nIG1vZGlmeUNvbW1pdE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKwkJCS8vIFNob3VsZCBhY3R1YWxseSBub3QgYmUgY2FsbGVkOyBidXQgZG8gc29tZXRoaW5nIHJlYXNvbmFibGUgYW55d2F5CisJCQlNb2RpZnlSZXN1bHQgcmVzdWx0ID0gZWRpdENvbW1pdE1lc3NhZ2UoCisJCQkJCW1lc3NhZ2UgPT0gbnVsbCA/ICIiIDogbWVzc2FnZSwgQ2xlYW51cE1vZGUuU1RSSVAsIC8vJE5PTi1OTFMtMSQKKwkJCQkJJyMnKTsKKwkJCXJldHVybiByZXN1bHQuZ2V0TWVzc2FnZSgpOworCQl9CisKKwkJLyoqCisJCSAqIERlc2NyaWJlcyB0aGUgcmVzdWx0IG9mIGVkaXRpbmcgYSBjb21taXQgbWVzc2FnZTogdGhlIG5ldyBtZXNzYWdlLAorCQkgKiBhbmQgaG93IGl0IHNob3VsZCBiZSBjbGVhbmVkLgorCQkgKi8KKwkJaW50ZXJmYWNlIE1vZGlmeVJlc3VsdCB7CisKKwkJCS8qKgorCQkJICogUmV0cmlldmVzIHRoZSBuZXcgY29tbWl0IG1lc3NhZ2UuCisJCQkgKgorCQkJICogQHJldHVybiB0aGUgbWVzc2FnZQorCQkJICovCisJCQlATm9uTnVsbAorCQkJU3RyaW5nIGdldE1lc3NhZ2UoKTsKKworCQkJLyoqCisJCQkgKiBUZWxscyBob3cgdGhlIG1lc3NhZ2UgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRNZXNzYWdlKCl9IHNob3VsZCBiZQorCQkJICogY2xlYW5lZC4KKwkJCSAqCisJCQkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgQ2xlYW51cE1vZGV9CisJCQkgKi8KKwkJCUBOb25OdWxsCisJCQlDbGVhbnVwTW9kZSBnZXRDbGVhbnVwTW9kZSgpOworCisJCQkvKioKKwkJCSAqIFRlbGxzIHdoZXRoZXIgYSBHZXJyaXQgQ2hhbmdlLUlkIHNob3VsZCBiZSBjb21wdXRlZCBhbmQgYWRkZWQgdG8KKwkJCSAqIHRoZSBjb21taXQgbWVzc2FnZSwgYXMgd2l0aAorCQkJICoge0BsaW5rIENvbW1pdENvbW1hbmQjc2V0SW5zZXJ0Q2hhbmdlSWQoYm9vbGVhbil9LgorCQkJICoKKwkJCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGEgQ2hhbmdlLUlkIHNob3VsZCBiZSBoYW5kbGVkLAorCQkJICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorCQkJICovCisJCQlib29sZWFuIHNob3VsZEFkZENoYW5nZUlkKCk7CisJCX0KKwl9CiAKIAlQZXJzb25JZGVudCBwYXJzZUF1dGhvcihieXRlW10gcmF3KSB7CiAJCWlmIChyYXcubGVuZ3RoID09IDApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kLmphdmEKaW5kZXggMjJlZjRkMC4uZGI4OGFkOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmQuamF2YQpAQCAtOSw2ICs5LDggQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKQEAgLTEyOCw4ICsxMzAsOSBAQCBwdWJsaWMgUmV2Q29tbWl0IGNhbGwoKSB0aHJvd3MgTm9NZXNzYWdlRXhjZXB0aW9uLCBVbm1lcmdlZFBhdGhzRXhjZXB0aW9uLAogCQkJCXJldldhbGsucGFyc2VIZWFkZXJzKHNyY1BhcmVudCk7CiAKIAkJCQlTdHJpbmcgb3VyTmFtZSA9IGNhbGN1bGF0ZU91ck5hbWUoaGVhZFJlZik7Ci0JCQkJU3RyaW5nIHJldmVydE5hbWUgPSBzcmNDb21taXQuZ2V0SWQoKS5hYmJyZXZpYXRlKDcpLm5hbWUoKQotCQkJCQkJKyAiICIgKyBzcmNDb21taXQuZ2V0U2hvcnRNZXNzYWdlKCk7IC8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgcmV2ZXJ0TmFtZSA9IHNyY0NvbW1pdC5nZXRJZCgpCisJCQkJCQkuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpLm5hbWUoKSArICIgIiAvLyROT04tTkxTLTEkCisJCQkJCQkrIHNyY0NvbW1pdC5nZXRTaG9ydE1lc3NhZ2UoKTsKIAogCQkJCVJlc29sdmVNZXJnZXIgbWVyZ2VyID0gKFJlc29sdmVNZXJnZXIpIHN0cmF0ZWd5Lm5ld01lcmdlcihyZXBvKTsKIAkJCQltZXJnZXIuc2V0V29ya2luZ1RyZWVJdGVyYXRvcihuZXcgRmlsZVRyZWVJdGVyYXRvcihyZXBvKSk7CkBAIC0xODMsOCArMTg2LDggQEAgcHVibGljIFJldkNvbW1pdCBjYWxsKCkgdGhyb3dzIE5vTWVzc2FnZUV4Y2VwdGlvbiwgVW5tZXJnZWRQYXRoc0V4Y2VwdGlvbiwKIAkJCQkJCQkJbWVyZ2VyLmdldE1lcmdlUmVzdWx0cygpLCBmYWlsaW5nUGF0aHMsIG51bGwpOwogCQkJCQlpZiAoIW1lcmdlci5mYWlsZWQoKSAmJiAhdW5tZXJnZWRQYXRocy5pc0VtcHR5KCkpIHsKIAkJCQkJCVN0cmluZyBtZXNzYWdlID0gbmV3IE1lcmdlTWVzc2FnZUZvcm1hdHRlcigpCi0JCQkJCQkuZm9ybWF0V2l0aENvbmZsaWN0cyhuZXdNZXNzYWdlLAotCQkJCQkJCQltZXJnZXIuZ2V0VW5tZXJnZWRQYXRocygpKTsKKwkJCQkJCQkJLmZvcm1hdFdpdGhDb25mbGljdHMobmV3TWVzc2FnZSwKKwkJCQkJCQkJCQltZXJnZXIuZ2V0VW5tZXJnZWRQYXRocygpLCAnIycpOwogCQkJCQkJcmVwby53cml0ZVJldmVydEhlYWQoc3JjQ29tbWl0LmdldElkKCkpOwogCQkJCQkJcmVwby53cml0ZU1lcmdlQ29tbWl0TXNnKG1lc3NhZ2UpOwogCQkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZC5qYXZhCmluZGV4IDM1ZmQ4OTkuLmY3YTFmNGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZC5qYXZhCkBAIC05LDYgKzksOCBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtMzAyLDcgKzMwNCw4IEBAIHB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCQkJYnVpbGRlci5zZXRQYXJlbnRJZChoZWFkQ29tbWl0KTsKIAkJCQlidWlsZGVyLnNldFRyZWVJZChjYWNoZS53cml0ZVRyZWUoaW5zZXJ0ZXIpKTsKIAkJCQlidWlsZGVyLnNldE1lc3NhZ2UoTWVzc2FnZUZvcm1hdC5mb3JtYXQoaW5kZXhNZXNzYWdlLCBicmFuY2gsCi0JCQkJCQloZWFkQ29tbWl0LmFiYnJldmlhdGUoNykubmFtZSgpLAorCQkJCQkJaGVhZENvbW1pdC5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkKKwkJCQkJCQkJLm5hbWUoKSwKIAkJCQkJCWhlYWRDb21taXQuZ2V0U2hvcnRNZXNzYWdlKCkpKTsKIAkJCQlPYmplY3RJZCBpbmRleENvbW1pdCA9IGluc2VydGVyLmluc2VydChidWlsZGVyKTsKIApAQCAtMzE5LDcgKzMyMiwxMCBAQCBwdWJsaWMgdm9pZCBhcHBseShEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJCQlidWlsZGVyLnNldFBhcmVudElkcyhuZXcgT2JqZWN0SWRbMF0pOwogCQkJCQlidWlsZGVyLnNldFRyZWVJZCh1bnRyYWNrZWREaXJDYWNoZS53cml0ZVRyZWUoaW5zZXJ0ZXIpKTsKIAkJCQkJYnVpbGRlci5zZXRNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1TR19VTlRSQUNLRUQsCi0JCQkJCQkJYnJhbmNoLCBoZWFkQ29tbWl0LmFiYnJldmlhdGUoNykubmFtZSgpLAorCQkJCQkJCWJyYW5jaCwKKwkJCQkJCQloZWFkQ29tbWl0CisJCQkJCQkJCQkuYWJicmV2aWF0ZShPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpCisJCQkJCQkJCQkubmFtZSgpLAogCQkJCQkJCWhlYWRDb21taXQuZ2V0U2hvcnRNZXNzYWdlKCkpKTsKIAkJCQkJdW50cmFja2VkQ29tbWl0ID0gaW5zZXJ0ZXIuaW5zZXJ0KGJ1aWxkZXIpOwogCQkJCX0KQEAgLTMzOSw3ICszNDUsOCBAQCBwdWJsaWMgdm9pZCBhcHBseShEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJCQlidWlsZGVyLmFkZFBhcmVudElkKHVudHJhY2tlZENvbW1pdCk7CiAJCQkJYnVpbGRlci5zZXRNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQkJd29ya2luZ0RpcmVjdG9yeU1lc3NhZ2UsIGJyYW5jaCwKLQkJCQkJCWhlYWRDb21taXQuYWJicmV2aWF0ZSg3KS5uYW1lKCksCisJCQkJCQloZWFkQ29tbWl0LmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKQorCQkJCQkJCQkubmFtZSgpLAogCQkJCQkJaGVhZENvbW1pdC5nZXRTaG9ydE1lc3NhZ2UoKSkpOwogCQkJCWJ1aWxkZXIuc2V0VHJlZUlkKGNhY2hlLndyaXRlVHJlZShpbnNlcnRlcikpOwogCQkJCWNvbW1pdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KGJ1aWxkZXIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hdHRyaWJ1dGVzL0F0dHJpYnV0ZXNIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F0dHJpYnV0ZXMvQXR0cmlidXRlc0hhbmRsZXIuamF2YQppbmRleCA2MzhkZDgyLi43ZWM3ODU5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F0dHJpYnV0ZXMvQXR0cmlidXRlc0hhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F0dHJpYnV0ZXMvQXR0cmlidXRlc0hhbmRsZXIuamF2YQpAQCAtMSw0MyArMSwxMSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSwgSXZhbiBNb3RzY2ggPGl2YW4ubW90c2NoQGJzaWFnLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxNSwgMjAyMiBJdmFuIE1vdHNjaCA8aXZhbi5tb3RzY2hAYnNpYWcuY29tPiBhbmQgb3RoZXJzCiAgKgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCiAgKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi0gKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLSAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCi0gKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAotICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7CiAKQEAgLTQ2LDYgKzE0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMuQXR0cmlidXRlLlN0YXRlOwpAQCAtODQsNiArNTMsOCBAQCBwdWJsaWMgY2xhc3MgQXR0cmlidXRlc0hhbmRsZXIgewogCiAJcHJpdmF0ZSBmaW5hbCBUcmVlV2FsayB0cmVlV2FsazsKIAorCXByaXZhdGUgZmluYWwgU3VwcGxpZXI8Q2Fub25pY2FsVHJlZVBhcnNlcj4gYXR0cmlidXRlc1RyZWU7CisKIAlwcml2YXRlIGZpbmFsIEF0dHJpYnV0ZXNOb2RlIGdsb2JhbE5vZGU7CiAKIAlwcml2YXRlIGZpbmFsIEF0dHJpYnV0ZXNOb2RlIGluZm9Ob2RlOwpAQCAtOTgsMjIgKzY5LDQxIEBAIHB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVzSGFuZGxlciB7CiAJICogQHBhcmFtIHRyZWVXYWxrCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrfQogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqIEBkZXByZWNhdGVkIHNpbmNlIDYuMSwgdXNlIHtAbGluayAjQXR0cmlidXRlc0hhbmRsZXIoVHJlZVdhbGssIFN1cHBsaWVyKX0KKwkgKiAgICAgICAgICAgICBpbnN0ZWFkCiAJICovCisJQERlcHJlY2F0ZWQKIAlwdWJsaWMgQXR0cmlidXRlc0hhbmRsZXIoVHJlZVdhbGsgdHJlZVdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRoaXModHJlZVdhbGssICgpIC0+IHRyZWVXYWxrLmdldFRyZWUoQ2Fub25pY2FsVHJlZVBhcnNlci5jbGFzcykpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzLkF0dHJpYnV0ZXNIYW5kbGVyfSB3aXRoCisJICogZGVmYXVsdCBydWxlcyBhcyB3ZWxsIGFzIG1lcmdlZCBydWxlcyBmcm9tIGdsb2JhbCwgaW5mbyBhbmQgd29ya3RyZWUgcm9vdAorCSAqIGF0dHJpYnV0ZXMKKwkgKgorCSAqIEBwYXJhbSB0cmVlV2FsaworCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2Fsa30KKwkgKiBAcGFyYW0gYXR0cmlidXRlc1RyZWUKKwkgKiAgICAgICAgICAgIHRoZSB0cmVlIHRvIHJlYWQgLmdpdGF0dHJpYnV0ZXMgZnJvbQorCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgQXR0cmlidXRlc0hhbmRsZXIoVHJlZVdhbGsgdHJlZVdhbGssCisJCQlTdXBwbGllcjxDYW5vbmljYWxUcmVlUGFyc2VyPiBhdHRyaWJ1dGVzVHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhpcy50cmVlV2FsayA9IHRyZWVXYWxrOwotCQlBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyIGF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgPXRyZWVXYWxrLmdldEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIoKTsKKwkJdGhpcy5hdHRyaWJ1dGVzVHJlZSA9IGF0dHJpYnV0ZXNUcmVlOworCQlBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyIGF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgPSB0cmVlV2FsaworCQkJCS5nZXRBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyKCk7CiAJCXRoaXMuZ2xvYmFsTm9kZSA9IGF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgIT0gbnVsbAogCQkJCT8gYXR0cmlidXRlc05vZGVQcm92aWRlci5nZXRHbG9iYWxBdHRyaWJ1dGVzTm9kZSgpIDogbnVsbDsKIAkJdGhpcy5pbmZvTm9kZSA9IGF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgIT0gbnVsbAogCQkJCT8gYXR0cmlidXRlc05vZGVQcm92aWRlci5nZXRJbmZvQXR0cmlidXRlc05vZGUoKSA6IG51bGw7CiAKIAkJQXR0cmlidXRlc05vZGUgcm9vdE5vZGUgPSBhdHRyaWJ1dGVzTm9kZSh0cmVlV2FsaywKLQkJCQlyb290T2YoCi0JCQkJCQl0cmVlV2Fsay5nZXRUcmVlKFdvcmtpbmdUcmVlSXRlcmF0b3IuY2xhc3MpKSwKLQkJCQlyb290T2YoCi0JCQkJCQl0cmVlV2Fsay5nZXRUcmVlKERpckNhY2hlSXRlcmF0b3IuY2xhc3MpKSwKLQkJCQlyb290T2YodHJlZVdhbGsKLQkJCQkJCS5nZXRUcmVlKENhbm9uaWNhbFRyZWVQYXJzZXIuY2xhc3MpKSk7CisJCQkJcm9vdE9mKHRyZWVXYWxrLmdldFRyZWUoV29ya2luZ1RyZWVJdGVyYXRvci5jbGFzcykpLAorCQkJCXJvb3RPZih0cmVlV2Fsay5nZXRUcmVlKERpckNhY2hlSXRlcmF0b3IuY2xhc3MpKSwKKwkJCQlyb290T2YoYXR0cmlidXRlc1RyZWUuZ2V0KCkpKTsKIAogCQlleHBhbnNpb25zLnB1dChCSU5BUllfUlVMRV9LRVksIEJJTkFSWV9SVUxFX0FUVFJJQlVURVMpOwogCQlmb3IgKEF0dHJpYnV0ZXNOb2RlIG5vZGUgOiBuZXcgQXR0cmlidXRlc05vZGVbXSB7IGdsb2JhbE5vZGUsIHJvb3ROb2RlLApAQCAtMTUyLDcgKzE0Miw3IEBAIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWlzRGlyZWN0b3J5LAogCQkJCXRyZWVXYWxrLmdldFRyZWUoV29ya2luZ1RyZWVJdGVyYXRvci5jbGFzcyksCiAJCQkJdHJlZVdhbGsuZ2V0VHJlZShEaXJDYWNoZUl0ZXJhdG9yLmNsYXNzKSwKLQkJCQl0cmVlV2Fsay5nZXRUcmVlKENhbm9uaWNhbFRyZWVQYXJzZXIuY2xhc3MpLAorCQkJCWF0dHJpYnV0ZXNUcmVlLmdldCgpLAogCQkJCWF0dHJpYnV0ZXMpOwogCiAJCS8vIEdldHMgdGhlIGF0dHJpYnV0ZXMgbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXIuamF2YQppbmRleCA0OWRhOTVjLi4xYTVmNzRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeS5DaGFuZ2VUeXBlLlJFTkFNRTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeS5TaWRlLk5FVzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeS5TaWRlLk9MRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLmVuY29kZTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLmVuY29kZUFTQ0lJOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZS5HSVRMSU5LOwpAQCAtOTAsNyArOTEsNyBAQCBwdWJsaWMgY2xhc3MgRGlmZkZvcm1hdHRlciBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUgewogCiAJcHJpdmF0ZSBpbnQgY29udGV4dCA9IDM7CiAKLQlwcml2YXRlIGludCBhYmJyZXZpYXRpb25MZW5ndGggPSA3OworCXByaXZhdGUgaW50IGFiYnJldmlhdGlvbkxlbmd0aCA9IE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKIAogCXByaXZhdGUgRGlmZkFsZ29yaXRobSBkaWZmQWxnb3JpdGhtOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ2hlY2tvdXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDaGVja291dC5qYXZhCmluZGV4IGM5MDRhNzguLjNkNTBhODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDaGVja291dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDaGVja291dC5qYXZhCkBAIC00LDcgKzQsOCBAQAogICogQ29weXJpZ2h0IChDKSAyMDA4LCBSb2dlciBDLiBTb2FyZXMgPHJvZ2Vyc29hcmVzQGludGVsaW5ldC5jb20uYnI+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4KICAqIENvcHlyaWdodCAoQykgMjAxMCwgQ2hyaXNpYW4gSGFsc3RyaWNrIDxjaHJpc3RpYW4uaGFsc3RyaWNrQHNhcC5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMCwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxOSwgMjAyMCwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxNywgMjAyMiwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTI5OSw3ICszMDAsNyBAQCBwdWJsaWMgdm9pZCBwcmVTY2FuVHdvVHJlZXMoKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQl3YWxrID0gbmV3IE5hbWVDb25mbGljdFRyZWVXYWxrKHJlcG8pOwogCQlidWlsZGVyID0gZGMuYnVpbGRlcigpOwogCi0JCWFkZFRyZWUod2FsaywgaGVhZENvbW1pdFRyZWUpOworCQl3YWxrLnNldEhlYWQoYWRkVHJlZSh3YWxrLCBoZWFkQ29tbWl0VHJlZSkpOwogCQlhZGRUcmVlKHdhbGssIG1lcmdlQ29tbWl0VHJlZSk7CiAJCWludCBkY2lQb3MgPSB3YWxrLmFkZFRyZWUobmV3IERpckNhY2hlQnVpbGRJdGVyYXRvcihidWlsZGVyKSk7CiAJCXdhbGsuYWRkVHJlZSh3b3JraW5nVHJlZSk7CkBAIC0zMTUsMTMgKzMxNiw2IEBAIHB1YmxpYyB2b2lkIHByZVNjYW5Ud29UcmVlcygpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkVHJlZShUcmVlV2FsayB0dywgT2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJdHcuYWRkVHJlZShuZXcgRW1wdHlUcmVlSXRlcmF0b3IoKSk7Ci0JCWVsc2UKLQkJCXR3LmFkZFRyZWUoaWQpOwotCX0KLQogCS8qKgogCSAqIFNjYW4gaW5kZXggYW5kIG1lcmdlIHRyZWUgKG5vIEhFQUQpLiBVc2VkIGUuZy4gZm9yIGluaXRpYWwgY2hlY2tvdXQgd2hlbgogCSAqIHRoZXJlIGlzIG5vIGhlYWQgeWV0LgpAQCAtMzQxLDcgKzMzNSw3IEBAIHB1YmxpYyB2b2lkIHByZXNjYW5PbmVUcmVlKCkKIAkJYnVpbGRlciA9IGRjLmJ1aWxkZXIoKTsKIAogCQl3YWxrID0gbmV3IE5hbWVDb25mbGljdFRyZWVXYWxrKHJlcG8pOwotCQlhZGRUcmVlKHdhbGssIG1lcmdlQ29tbWl0VHJlZSk7CisJCXdhbGsuc2V0SGVhZChhZGRUcmVlKHdhbGssIG1lcmdlQ29tbWl0VHJlZSkpOwogCQlpbnQgZGNpUG9zID0gd2Fsay5hZGRUcmVlKG5ldyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoYnVpbGRlcikpOwogCQl3YWxrLmFkZFRyZWUod29ya2luZ1RyZWUpOwogCQl3b3JraW5nVHJlZS5zZXREaXJDYWNoZUl0ZXJhdG9yKHdhbGssIGRjaVBvcyk7CkBAIC0zNTYsNiArMzUwLDE0IEBAIHB1YmxpYyB2b2lkIHByZXNjYW5PbmVUcmVlKCkKIAkJY29uZmxpY3RzLnJlbW92ZUFsbChyZW1vdmVkKTsKIAl9CiAKKwlwcml2YXRlIGludCBhZGRUcmVlKFRyZWVXYWxrIHR3LCBPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWlmIChpZCA9PSBudWxsKSB7CisJCQlyZXR1cm4gdHcuYWRkVHJlZShuZXcgRW1wdHlUcmVlSXRlcmF0b3IoKSk7CisJCX0KKwkJcmV0dXJuIHR3LmFkZFRyZWUoaWQpOworCX0KKwogCS8qKgogCSAqIFByb2Nlc3NpbmcgYW4gZW50cnkgaW4gdGhlIGNvbnRleHQgb2Yge0BsaW5rICNwcmVzY2FuT25lVHJlZSgpfSB3aGVuIG9ubHkKIAkgKiBvbmUgdHJlZSBpcyBnaXZlbgpAQCAtMzgyLDE3ICszODQsMTQgQEAgdm9pZCBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBtLCBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IgaSwKIAkJCQkJCS8vIGZhaWxPbkNvbmZsaWN0IGlzIGZhbHNlLiBQdXR0aW5nIHNvbWV0aGluZyB0byBjb25mbGljdHMKIAkJCQkJCS8vIHdvdWxkIG1lYW4gd2UgZGVsZXRlIGl0LiBJbnN0ZWFkIHdlIHdhbnQgdGhlIG1lcmdlQ29tbWl0CiAJCQkJCQkvLyBjb250ZW50IHRvIGJlIGNoZWNrZWQgb3V0LgotCQkJCQkJdXBkYXRlKG0uZ2V0RW50cnlQYXRoU3RyaW5nKCksIG0uZ2V0RW50cnlPYmplY3RJZCgpLAotCQkJCQkJCQltLmdldEVudHJ5RmlsZU1vZGUoKSk7CisJCQkJCQl1cGRhdGUobSk7CiAJCQkJCX0KIAkJCQl9IGVsc2UKLQkJCQkJdXBkYXRlKG0uZ2V0RW50cnlQYXRoU3RyaW5nKCksIG0uZ2V0RW50cnlPYmplY3RJZCgpLAotCQkJCQkJbS5nZXRFbnRyeUZpbGVNb2RlKCkpOworCQkJCQl1cGRhdGUobSk7CiAJCQl9IGVsc2UgaWYgKGYgPT0gbnVsbCB8fCAhbS5pZEVxdWFsKGkpKSB7CiAJCQkJLy8gVGhlIHdvcmtpbmcgdHJlZSBmaWxlIGlzIG1pc3Npbmcgb3IgdGhlIG1lcmdlIGNvbnRlbnQgZGlmZmVycwogCQkJCS8vIGZyb20gaW5kZXggY29udGVudAotCQkJCXVwZGF0ZShtLmdldEVudHJ5UGF0aFN0cmluZygpLCBtLmdldEVudHJ5T2JqZWN0SWQoKSwKLQkJCQkJCW0uZ2V0RW50cnlGaWxlTW9kZSgpKTsKKwkJCQl1cGRhdGUobSk7CiAJCQl9IGVsc2UgaWYgKGkuZ2V0RGlyQ2FjaGVFbnRyeSgpICE9IG51bGwpIHsKIAkJCQkvLyBUaGUgaW5kZXggY29udGFpbnMgYSBmaWxlIChhbmQgbm90IGEgZm9sZGVyKQogCQkJCWlmIChmLmlzTW9kaWZpZWQoaS5nZXREaXJDYWNoZUVudHJ5KCksIHRydWUsCkBAIC00MDAsOCArMzk5LDcgQEAgdm9pZCBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBtLCBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IgaSwKIAkJCQkJCXx8IGkuZ2V0RGlyQ2FjaGVFbnRyeSgpLmdldFN0YWdlKCkgIT0gMCkKIAkJCQkJLy8gVGhlIHdvcmtpbmcgdHJlZSBmaWxlIGlzIGRpcnR5IG9yIHRoZSBpbmRleCBjb250YWlucyBhCiAJCQkJCS8vIGNvbmZsaWN0Ci0JCQkJCXVwZGF0ZShtLmdldEVudHJ5UGF0aFN0cmluZygpLCBtLmdldEVudHJ5T2JqZWN0SWQoKSwKLQkJCQkJCQltLmdldEVudHJ5RmlsZU1vZGUoKSk7CisJCQkJCXVwZGF0ZShtKTsKIAkJCQllbHNlIHsKIAkJCQkJLy8gdXBkYXRlIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGluZGV4IHdpdGggdGhlIG9uZSBmcm9tIHRoZQogCQkJCQkvLyBmaWxlIGlmIG5vdCBzZXQsIGFzIHdlIGFyZSBzdXJlIHRvIGJlIGluIHN5bmMgaGVyZS4KQEAgLTgwMiw3ICs4MDAsNyBAQCB2b2lkIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGgsIENhbm9uaWNhbFRyZWVQYXJzZXIgbSwKIAkJCQlpZiAoZiAhPSBudWxsICYmIGlzTW9kaWZpZWRTdWJ0cmVlX0luZGV4V29ya2luZ3RyZWUobmFtZSkpIHsKIAkJCQkJY29uZmxpY3QobmFtZSwgZGNlLCBoLCBtKTsgLy8gMQogCQkJCX0gZWxzZSB7Ci0JCQkJCXVwZGF0ZShuYW1lLCBtSWQsIG1Nb2RlKTsgLy8gMgorCQkJCQl1cGRhdGUoMSwgbmFtZSwgbUlkLCBtTW9kZSk7IC8vIDIKIAkJCQl9CiAKIAkJCQlicmVhazsKQEAgLTgyOCw3ICs4MjYsNyBAQCB2b2lkIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGgsIENhbm9uaWNhbFRyZWVQYXJzZXIgbSwKIAkJCQkvLyBhcmUgZm91bmQgbGF0ZXIKIAkJCQlicmVhazsKIAkJCWNhc2UgMHhEMEY6IC8vIDE5Ci0JCQkJdXBkYXRlKG5hbWUsIG1JZCwgbU1vZGUpOworCQkJCXVwZGF0ZSgxLCBuYW1lLCBtSWQsIG1Nb2RlKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMHhERjA6IC8vIGNvbmZsaWN0IHdpdGhvdXQgYSBydWxlCiAJCQljYXNlIDB4MEZEOiAvLyAxNQpAQCAtODM5LDcgKzgzNyw3IEBAIHZvaWQgcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgaCwgQ2Fub25pY2FsVHJlZVBhcnNlciBtLAogCQkJCQlpZiAoaXNNb2RpZmllZFN1YnRyZWVfSW5kZXhXb3JraW5ndHJlZShuYW1lKSkKIAkJCQkJCWNvbmZsaWN0KG5hbWUsIGRjZSwgaCwgbSk7IC8vIDgKIAkJCQkJZWxzZQotCQkJCQkJdXBkYXRlKG5hbWUsIG1JZCwgbU1vZGUpOyAvLyA3CisJCQkJCQl1cGRhdGUoMSwgbmFtZSwgbUlkLCBtTW9kZSk7IC8vIDcKIAkJCQl9IGVsc2UKIAkJCQkJY29uZmxpY3QobmFtZSwgZGNlLCBoLCBtKTsgLy8gOQogCQkJCWJyZWFrOwpAQCAtODU5LDcgKzg1Nyw3IEBAIHZvaWQgcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgaCwgQ2Fub25pY2FsVHJlZVBhcnNlciBtLAogCQkJCWJyZWFrOwogCQkJY2FzZSAweDBERjogLy8gMTYgMTcKIAkJCQlpZiAoIWlzTW9kaWZpZWRTdWJ0cmVlX0luZGV4V29ya2luZ3RyZWUobmFtZSkpCi0JCQkJCXVwZGF0ZShuYW1lLCBtSWQsIG1Nb2RlKTsKKwkJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOwogCQkJCWVsc2UKIAkJCQkJY29uZmxpY3QobmFtZSwgZGNlLCBoLCBtKTsKIAkJCQlicmVhazsKQEAgLTkyOSw3ICs5MjcsNyBAQCB2b2lkIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGgsIENhbm9uaWNhbFRyZWVQYXJzZXIgbSwKIAkJCQkvLyBBdCBsZWFzdCBvbmUgb2YgSGVhZCwgSW5kZXgsIE1lcmdlIGlzIG5vdCBlbXB0eQogCQkJCS8vIC0+IG9ubHkgTWVyZ2UgY29udGFpbnMgc29tZXRoaW5nIGZvciB0aGlzIHBhdGguIFVzZSBpdCEKIAkJCQkvLyBQb3RlbnRpYWxseSB1cGRhdGUgdGhlIGZpbGUKLQkJCQl1cGRhdGUobmFtZSwgbUlkLCBtTW9kZSk7IC8vIDEKKwkJCQl1cGRhdGUoMSwgbmFtZSwgbUlkLCBtTW9kZSk7IC8vIDEKIAkJCWVsc2UgaWYgKG0gPT0gbnVsbCkKIAkJCQkvLyBOb3RoaW5nIGluIE1lcmdlCiAJCQkJLy8gU29tZXRoaW5nIGluIEhlYWQKQEAgLTk0Nyw3ICs5NDUsNyBAQCBlbHNlIGlmIChtID09IG51bGwpCiAJCQkJLy8gZmluZCBpbiBNZXJnZS4gUG90ZW50aWFsbHkgdXBkYXRlcyB0aGUgZmlsZS4KIAkJCQlpZiAoZXF1YWxJZEFuZE1vZGUoaElkLCBoTW9kZSwgbUlkLCBtTW9kZSkpIHsKIAkJCQkJaWYgKGluaXRpYWxDaGVja291dCB8fCBmb3JjZSkgewotCQkJCQkJdXBkYXRlKG5hbWUsIG1JZCwgbU1vZGUpOworCQkJCQkJdXBkYXRlKDEsIG5hbWUsIG1JZCwgbU1vZGUpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJa2VlcChuYW1lLCBkY2UsIGYpOwogCQkJCQl9CkBAIC0xMTMxLDcgKzExMjksNyBAQCAmJiBpc01vZGlmaWVkX0luZGV4VHJlZShuYW1lLCBpSWQsIGlNb2RlLCBtSWQsIG1Nb2RlLAogCiAJCQkJCQkvLyBUT0RPIGNoZWNrIHRoYXQgd2UgZG9uJ3Qgb3ZlcndyaXRlIHNvbWUgdW5zYXZlZAogCQkJCQkJLy8gZmlsZSBjb250ZW50Ci0JCQkJCQl1cGRhdGUobmFtZSwgbUlkLCBtTW9kZSk7CisJCQkJCQl1cGRhdGUoMSwgbmFtZSwgbUlkLCBtTW9kZSk7CiAJCQkJCX0gZWxzZSBpZiAoZGNlICE9IG51bGwKIAkJCQkJCQkmJiAoZiAhPSBudWxsICYmIGYuaXNNb2RpZmllZChkY2UsIHRydWUsCiAJCQkJCQkJCQl0aGlzLndhbGsuZ2V0T2JqZWN0UmVhZGVyKCkpKSkgewpAQCAtMTE1MCw3ICsxMTQ4LDcgQEAgJiYgaXNNb2RpZmllZF9JbmRleFRyZWUobmFtZSwgaUlkLCBpTW9kZSwgbUlkLCBtTW9kZSwKIAkJCQkJCS8vIC0+IFN0YW5kYXJkIGNhc2Ugd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBicmFuY2hlczoKIAkJCQkJCS8vIE5vdGhpbmcgbmV3IGluIGluZGV4IGJ1dCBzb21ldGhpbmcgZGlmZmVyZW50IGluCiAJCQkJCQkvLyBNZXJnZS4gVXBkYXRlIGluZGV4IGFuZCBmaWxlCi0JCQkJCQl1cGRhdGUobmFtZSwgbUlkLCBtTW9kZSk7CisJCQkJCQl1cGRhdGUoMSwgbmFtZSwgbUlkLCBtTW9kZSk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewogCQkJCQkvLyBIZWFkIGRpZmZlcnMgZnJvbSBpbmRleCBvciBtZXJnZSBpcyBzYW1lIGFzIGluZGV4CkBAIC0xMjM3LDEyICsxMjM1LDE3IEBAIHByaXZhdGUgdm9pZCByZW1vdmUoU3RyaW5nIHBhdGgpIHsKIAkJcmVtb3ZlZC5hZGQocGF0aCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZShTdHJpbmcgcGF0aCwgT2JqZWN0SWQgbUlkLCBGaWxlTW9kZSBtb2RlKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgdXBkYXRlKENhbm9uaWNhbFRyZWVQYXJzZXIgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdXBkYXRlKDAsIHRyZWUuZ2V0RW50cnlQYXRoU3RyaW5nKCksIHRyZWUuZ2V0RW50cnlPYmplY3RJZCgpLAorCQkJCXRyZWUuZ2V0RW50cnlGaWxlTW9kZSgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlKGludCBpbmRleCwgU3RyaW5nIHBhdGgsIE9iamVjdElkIG1JZCwKKwkJCUZpbGVNb2RlIG1vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICghRmlsZU1vZGUuVFJFRS5lcXVhbHMobW9kZSkpIHsKIAkJCXVwZGF0ZWQucHV0KHBhdGgsIG5ldyBDaGVja291dE1ldGFkYXRhKAotCQkJCQl3YWxrLmdldEVvbFN0cmVhbVR5cGUoQ0hFQ0tPVVRfT1ApLAotCQkJCQl3YWxrLmdldEZpbHRlckNvbW1hbmQoQ29uc3RhbnRzLkFUVFJfRklMVEVSX1RZUEVfU01VREdFKSkpOworCQkJCQl3YWxrLmdldENoZWNrb3V0RW9sU3RyZWFtVHlwZShpbmRleCksCisJCQkJCXdhbGsuZ2V0U211ZGdlQ29tbWFuZChpbmRleCkpKTsKIAogCQkJRGlyQ2FjaGVFbnRyeSBlbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KHBhdGgsIERpckNhY2hlRW50cnkuU1RBR0VfMCk7CiAJCQllbnRyeS5zZXRPYmplY3RJZChtSWQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL0JhcmVTdXBlcnByb2plY3RXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9CYXJlU3VwZXJwcm9qZWN0V3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2MjZhZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9CYXJlU3VwZXJwcm9qZWN0V3JpdGVyLmphdmEKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIEdvb2dsZSBJbmMuIGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzsKKworaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX1RBR1M7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5Db25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb0NvbW1hbmQuTWFuaWZlc3RFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb0NvbW1hbmQuUmVtb3RlRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb0NvbW1hbmQuUmVtb3RlUmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvQ29tbWFuZC5SZW1vdGVVbmF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb1Byb2plY3QuQ29weUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Qcm9qZWN0LkxpbmtGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5pbnRlcm5hbC5SZXBvVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdEJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlLlJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlsczsKKworLyoqCisgKiBXcml0ZXMgLmdpdG1vZHVsZXMgYW5kIGdpdGxpbmtzIG9mIHBhcnNlZCBtYW5pZmVzdCBwcm9qZWN0cyBpbnRvIGEgYmFyZQorICogcmVwb3NpdG9yeS4KKyAqCisgKiBUbyB3cml0ZSBvbiBhIHJlZ3VsYXIgcmVwb3NpdG9yeSwgc2VlIHtAbGluayBSZWd1bGFyU3VwZXJwcm9qZWN0V3JpdGVyfS4KKyAqLworY2xhc3MgQmFyZVN1cGVycHJvamVjdFdyaXRlciB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfRkFJTFVSRV9NQVhfUkVUUklFUyA9IDU7CisKKwkvLyBSZXRyeSBleHBvbmVudGlhbGx5IHdpdGggZGVsYXlzIGluIHRoaXMgcmFuZ2UKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19GQUlMVVJFX01JTl9SRVRSWV9ERUxBWV9NSUxMSVMgPSA1MDsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX0ZBSUxVUkVfTUFYX1JFVFJZX0RFTEFZX01JTExJUyA9IDUwMDA7CisKKwlwcml2YXRlIGZpbmFsIFJlcG9zaXRvcnkgcmVwbzsKKworCXByaXZhdGUgZmluYWwgVVJJIHRhcmdldFVyaTsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIHRhcmdldEJyYW5jaDsKKworCXByaXZhdGUgZmluYWwgUmVtb3RlUmVhZGVyIGNhbGxiYWNrOworCisJcHJpdmF0ZSBmaW5hbCBCYXJlV3JpdGVyQ29uZmlnIGNvbmZpZzsKKworCXByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgYXV0aG9yOworCisJcHJpdmF0ZSBMaXN0PEV4dHJhQ29udGVudD4gZXh0cmFDb250ZW50czsKKworCXN0YXRpYyBjbGFzcyBCYXJlV3JpdGVyQ29uZmlnIHsKKwkJYm9vbGVhbiBpZ25vcmVSZW1vdGVGYWlsdXJlcyA9IGZhbHNlOworCisJCWJvb2xlYW4gcmVjb3JkUmVtb3RlQnJhbmNoID0gdHJ1ZTsKKworCQlib29sZWFuIHJlY29yZFN1Ym1vZHVsZUxhYmVscyA9IHRydWU7CisKKwkJYm9vbGVhbiByZWNvcmRTaGFsbG93U3VibW9kdWxlcyA9IHRydWU7CisKKwkJc3RhdGljIEJhcmVXcml0ZXJDb25maWcgZ2V0RGVmYXVsdCgpIHsKKwkJCXJldHVybiBuZXcgQmFyZVdyaXRlckNvbmZpZygpOworCQl9CisKKwkJcHJpdmF0ZSBCYXJlV3JpdGVyQ29uZmlnKCkgeworCQl9CisJfQorCisJc3RhdGljIGNsYXNzIEV4dHJhQ29udGVudCB7CisJCWZpbmFsIFN0cmluZyBwYXRoOworCisJCWZpbmFsIFN0cmluZyBjb250ZW50OworCisJCUV4dHJhQ29udGVudChTdHJpbmcgcGF0aCwgU3RyaW5nIGNvbnRlbnQpIHsKKwkJCXRoaXMucGF0aCA9IHBhdGg7CisJCQl0aGlzLmNvbnRlbnQgPSBjb250ZW50OworCQl9CisJfQorCisJQmFyZVN1cGVycHJvamVjdFdyaXRlcihSZXBvc2l0b3J5IHJlcG8sIFVSSSB0YXJnZXRVcmksCisJCQlTdHJpbmcgdGFyZ2V0QnJhbmNoLAorCQkJUGVyc29uSWRlbnQgYXV0aG9yLCBSZW1vdGVSZWFkZXIgY2FsbGJhY2ssCisJCQlCYXJlV3JpdGVyQ29uZmlnIGNvbmZpZywKKwkJCUxpc3Q8RXh0cmFDb250ZW50PiBleHRyYUNvbnRlbnRzKSB7CisJCWFzc2VydCAocmVwby5pc0JhcmUoKSk7CisJCXRoaXMucmVwbyA9IHJlcG87CisJCXRoaXMudGFyZ2V0VXJpID0gdGFyZ2V0VXJpOworCQl0aGlzLnRhcmdldEJyYW5jaCA9IHRhcmdldEJyYW5jaDsKKwkJdGhpcy5hdXRob3IgPSBhdXRob3I7CisJCXRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKKwkJdGhpcy5jb25maWcgPSBjb25maWc7CisJCXRoaXMuZXh0cmFDb250ZW50cyA9IGV4dHJhQ29udGVudHM7CisJfQorCisJUmV2Q29tbWl0IHdyaXRlKExpc3Q8UmVwb1Byb2plY3Q+IHJlcG9Qcm9qZWN0cykKKwkJCXRocm93cyBHaXRBUElFeGNlcHRpb24geworCQlEaXJDYWNoZSBpbmRleCA9IERpckNhY2hlLm5ld0luQ29yZSgpOworCQlPYmplY3RJbnNlcnRlciBpbnNlcnRlciA9IHJlcG8ubmV3T2JqZWN0SW5zZXJ0ZXIoKTsKKworCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhyZXBvKSkgeworCQkJcHJlcGFyZUluZGV4KHJlcG9Qcm9qZWN0cywgaW5kZXgsIGluc2VydGVyKTsKKwkJCU9iamVjdElkIHRyZWVJZCA9IGluZGV4LndyaXRlVHJlZShpbnNlcnRlcik7CisJCQlsb25nIHByZXZEZWxheSA9IDA7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IExPQ0tfRkFJTFVSRV9NQVhfUkVUUklFUyAtIDE7IGkrKykgeworCQkJCXRyeSB7CisJCQkJCXJldHVybiBjb21taXRUcmVlT25DdXJyZW50VGlwKGluc2VydGVyLCBydywgdHJlZUlkKTsKKwkJCQl9IGNhdGNoIChDb25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uIGUpIHsKKwkJCQkJcHJldkRlbGF5ID0gRmlsZVV0aWxzLmRlbGF5KHByZXZEZWxheSwKKwkJCQkJCQlMT0NLX0ZBSUxVUkVfTUlOX1JFVFJZX0RFTEFZX01JTExJUywKKwkJCQkJCQlMT0NLX0ZBSUxVUkVfTUFYX1JFVFJZX0RFTEFZX01JTExJUyk7CisJCQkJCVRocmVhZC5zbGVlcChwcmV2RGVsYXkpOworCQkJCQlyZXBvLmdldFJlZkRhdGFiYXNlKCkucmVmcmVzaCgpOworCQkJCX0KKwkJCX0KKwkJCS8vIEluIHRoZSBsYXN0IHRyeSwganVzdCBwcm9wYWdhdGUgdGhlIGV4Y2VwdGlvbnMKKwkJCXJldHVybiBjb21taXRUcmVlT25DdXJyZW50VGlwKGluc2VydGVyLCBydywgdHJlZUlkKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgTWFuaWZlc3RFcnJvckV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwcmVwYXJlSW5kZXgoTGlzdDxSZXBvUHJvamVjdD4gcHJvamVjdHMsIERpckNhY2hlIGluZGV4LAorCQkJT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNmZyA9IG5ldyBDb25maWcoKTsKKwkJU3RyaW5nQnVpbGRlciBhdHRyaWJ1dGVzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJRGlyQ2FjaGVCdWlsZGVyIGJ1aWxkZXIgPSBpbmRleC5idWlsZGVyKCk7CisJCWZvciAoUmVwb1Byb2plY3QgcHJvaiA6IHByb2plY3RzKSB7CisJCQlTdHJpbmcgbmFtZSA9IHByb2ouZ2V0TmFtZSgpOworCQkJU3RyaW5nIHBhdGggPSBwcm9qLmdldFBhdGgoKTsKKwkJCVN0cmluZyB1cmwgPSBwcm9qLmdldFVybCgpOworCQkJT2JqZWN0SWQgb2JqZWN0SWQ7CisJCQlpZiAoT2JqZWN0SWQuaXNJZChwcm9qLmdldFJldmlzaW9uKCkpKSB7CisJCQkJb2JqZWN0SWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKHByb2ouZ2V0UmV2aXNpb24oKSk7CisJCQl9IGVsc2UgeworCQkJCW9iamVjdElkID0gY2FsbGJhY2suc2hhMSh1cmwsIHByb2ouZ2V0UmV2aXNpb24oKSk7CisJCQkJaWYgKG9iamVjdElkID09IG51bGwgJiYgIWNvbmZpZy5pZ25vcmVSZW1vdGVGYWlsdXJlcykgeworCQkJCQl0aHJvdyBuZXcgUmVtb3RlVW5hdmFpbGFibGVFeGNlcHRpb24odXJsKTsKKwkJCQl9CisJCQkJaWYgKGNvbmZpZy5yZWNvcmRSZW1vdGVCcmFuY2gpIHsKKwkJCQkJLy8gImJyYW5jaCIgZmllbGQgaXMgb25seSBmb3Igbm9uLXRhZyByZWZlcmVuY2VzLgorCQkJCQkvLyBLZWVwIHRhZ3MgaW4gInJlZiIgZmllbGQgYXMgaGludCBmb3Igb3RoZXIgdG9vbHMuCisJCQkJCVN0cmluZyBmaWVsZCA9IHByb2ouZ2V0UmV2aXNpb24oKS5zdGFydHNXaXRoKFJfVEFHUykgPyAicmVmIiAvLyROT04tTkxTLTEkCisJCQkJCQkJOiAiYnJhbmNoIjsgLy8kTk9OLU5MUy0xJAorCQkJCQljZmcuc2V0U3RyaW5nKCJzdWJtb2R1bGUiLCBuYW1lLCBmaWVsZCwgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXByb2ouZ2V0UmV2aXNpb24oKSk7CisJCQkJfQorCisJCQkJaWYgKGNvbmZpZy5yZWNvcmRTaGFsbG93U3VibW9kdWxlcworCQkJCQkJJiYgcHJvai5nZXRSZWNvbW1lbmRTaGFsbG93KCkgIT0gbnVsbCkgeworCQkJCQkvLyBUaGUgc2hhbGxvdyByZWNvbW1lbmRhdGlvbiBpcyBsb3NpbmcgaW5mb3JtYXRpb24uCisJCQkJCS8vIEFzIHRoZSByZXBvIG1hbmlmZXN0cyBzdG9yZXMgdGhlIHJlY29tbWVuZGVkCisJCQkJCS8vIGRlcHRoIGluIHRoZSAnY2xvbmUtZGVwdGgnIGZpZWxkLCB3aGlsZQorCQkJCQkvLyBnaXQgY29yZSBvbmx5IHVzZXMgYSBiaW5hcnkgJ3NoYWxsb3cgPSB0cnVlL2ZhbHNlJworCQkJCQkvLyBoaW50LCB3ZSdsbCBtYXAgYW55IGRlcHRoIHRvICdzaGFsbG93ID0gdHJ1ZScKKwkJCQkJY2ZnLnNldEJvb2xlYW4oInN1Ym1vZHVsZSIsIG5hbWUsICJzaGFsbG93IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJdHJ1ZSk7CisJCQkJfQorCQkJfQorCQkJaWYgKGNvbmZpZy5yZWNvcmRTdWJtb2R1bGVMYWJlbHMpIHsKKwkJCQlTdHJpbmdCdWlsZGVyIHJlYyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQkJcmVjLmFwcGVuZCgiLyIpOyAvLyROT04tTkxTLTEkCisJCQkJcmVjLmFwcGVuZChwYXRoKTsKKwkJCQlmb3IgKFN0cmluZyBncm91cCA6IHByb2ouZ2V0R3JvdXBzKCkpIHsKKwkJCQkJcmVjLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCisJCQkJCXJlYy5hcHBlbmQoZ3JvdXApOworCQkJCX0KKwkJCQlyZWMuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJYXR0cmlidXRlcy5hcHBlbmQocmVjLnRvU3RyaW5nKCkpOworCQkJfQorCisJCQlVUkkgc3VibW9kVXJsID0gVVJJLmNyZWF0ZSh1cmwpOworCQkJaWYgKHRhcmdldFVyaSAhPSBudWxsKSB7CisJCQkJc3VibW9kVXJsID0gUmVwb0NvbW1hbmQucmVsYXRpdml6ZSh0YXJnZXRVcmksIHN1Ym1vZFVybCk7CisJCQl9CisJCQljZmcuc2V0U3RyaW5nKCJzdWJtb2R1bGUiLCBuYW1lLCAicGF0aCIsIHBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCWNmZy5zZXRTdHJpbmcoInN1Ym1vZHVsZSIsIG5hbWUsICJ1cmwiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJc3VibW9kVXJsLnRvU3RyaW5nKCkpOworCisJCQkvLyBjcmVhdGUgZ2l0bGluaworCQkJaWYgKG9iamVjdElkICE9IG51bGwpIHsKKwkJCQlEaXJDYWNoZUVudHJ5IGRjRW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeShwYXRoKTsKKwkJCQlkY0VudHJ5LnNldE9iamVjdElkKG9iamVjdElkKTsKKwkJCQlkY0VudHJ5LnNldEZpbGVNb2RlKEZpbGVNb2RlLkdJVExJTkspOworCQkJCWJ1aWxkZXIuYWRkKGRjRW50cnkpOworCisJCQkJZm9yIChDb3B5RmlsZSBjb3B5ZmlsZSA6IHByb2ouZ2V0Q29weUZpbGVzKCkpIHsKKwkJCQkJUmVtb3RlRmlsZSByZiA9IGNhbGxiYWNrLnJlYWRGaWxlV2l0aE1vZGUodXJsLAorCQkJCQkJCXByb2ouZ2V0UmV2aXNpb24oKSwgY29weWZpbGUuc3JjKTsKKwkJCQkJb2JqZWN0SWQgPSBpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLAorCQkJCQkJCXJmLmdldENvbnRlbnRzKCkpOworCQkJCQlkY0VudHJ5ID0gbmV3IERpckNhY2hlRW50cnkoY29weWZpbGUuZGVzdCk7CisJCQkJCWRjRW50cnkuc2V0T2JqZWN0SWQob2JqZWN0SWQpOworCQkJCQlkY0VudHJ5LnNldEZpbGVNb2RlKHJmLmdldEZpbGVNb2RlKCkpOworCQkJCQlidWlsZGVyLmFkZChkY0VudHJ5KTsKKwkJCQl9CisJCQkJZm9yIChMaW5rRmlsZSBsaW5rZmlsZSA6IHByb2ouZ2V0TGlua0ZpbGVzKCkpIHsKKwkJCQkJU3RyaW5nIGxpbms7CisJCQkJCWlmIChsaW5rZmlsZS5kZXN0LmNvbnRhaW5zKCIvIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJbGluayA9IEZpbGVVdGlscy5yZWxhdGl2aXplR2l0UGF0aCgKKwkJCQkJCQkJbGlua2ZpbGUuZGVzdC5zdWJzdHJpbmcoMCwKKwkJCQkJCQkJCQlsaW5rZmlsZS5kZXN0Lmxhc3RJbmRleE9mKCcvJykpLAorCQkJCQkJCQlwcm9qLmdldFBhdGgoKSArICIvIiArIGxpbmtmaWxlLnNyYyk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxpbmsgPSBwcm9qLmdldFBhdGgoKSArICIvIiArIGxpbmtmaWxlLnNyYzsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisKKwkJCQkJb2JqZWN0SWQgPSBpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLAorCQkJCQkJCWxpbmsuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkJZGNFbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KGxpbmtmaWxlLmRlc3QpOworCQkJCQlkY0VudHJ5LnNldE9iamVjdElkKG9iamVjdElkKTsKKwkJCQkJZGNFbnRyeS5zZXRGaWxlTW9kZShGaWxlTW9kZS5TWU1MSU5LKTsKKwkJCQkJYnVpbGRlci5hZGQoZGNFbnRyeSk7CisJCQkJfQorCQkJfQorCQl9CisJCVN0cmluZyBjb250ZW50ID0gY2ZnLnRvVGV4dCgpOworCisJCS8vIGNyZWF0ZSBhIG5ldyBEaXJDYWNoZUVudHJ5IGZvciAuZ2l0bW9kdWxlcyBmaWxlLgorCQlEaXJDYWNoZUVudHJ5IGRjRW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeSgKKwkJCQlDb25zdGFudHMuRE9UX0dJVF9NT0RVTEVTKTsKKwkJT2JqZWN0SWQgb2JqZWN0SWQgPSBpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLAorCQkJCWNvbnRlbnQuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJZGNFbnRyeS5zZXRPYmplY3RJZChvYmplY3RJZCk7CisJCWRjRW50cnkuc2V0RmlsZU1vZGUoRmlsZU1vZGUuUkVHVUxBUl9GSUxFKTsKKwkJYnVpbGRlci5hZGQoZGNFbnRyeSk7CisKKwkJaWYgKGNvbmZpZy5yZWNvcmRTdWJtb2R1bGVMYWJlbHMpIHsKKwkJCS8vIGNyZWF0ZSBhIG5ldyBEaXJDYWNoZUVudHJ5IGZvciAuZ2l0YXR0cmlidXRlcyBmaWxlLgorCQkJRGlyQ2FjaGVFbnRyeSBkY0VudHJ5QXR0ciA9IG5ldyBEaXJDYWNoZUVudHJ5KAorCQkJCQlDb25zdGFudHMuRE9UX0dJVF9BVFRSSUJVVEVTKTsKKwkJCU9iamVjdElkIGF0dHJJZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCisJCQkJCWF0dHJpYnV0ZXMudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQkJZGNFbnRyeUF0dHIuc2V0T2JqZWN0SWQoYXR0cklkKTsKKwkJCWRjRW50cnlBdHRyLnNldEZpbGVNb2RlKEZpbGVNb2RlLlJFR1VMQVJfRklMRSk7CisJCQlidWlsZGVyLmFkZChkY0VudHJ5QXR0cik7CisJCX0KKworCQlmb3IgKEV4dHJhQ29udGVudCBlYyA6IGV4dHJhQ29udGVudHMpIHsKKwkJCURpckNhY2hlRW50cnkgZXh0cmFEY0VudHJ5ID0gbmV3IERpckNhY2hlRW50cnkoZWMucGF0aCk7CisKKwkJCU9iamVjdElkIG9pZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCisJCQkJCWVjLmNvbnRlbnQuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCWV4dHJhRGNFbnRyeS5zZXRPYmplY3RJZChvaWQpOworCQkJZXh0cmFEY0VudHJ5LnNldEZpbGVNb2RlKEZpbGVNb2RlLlJFR1VMQVJfRklMRSk7CisJCQlidWlsZGVyLmFkZChleHRyYURjRW50cnkpOworCQl9CisKKwkJYnVpbGRlci5maW5pc2goKTsKKwl9CisKKwlwcml2YXRlIFJldkNvbW1pdCBjb21taXRUcmVlT25DdXJyZW50VGlwKE9iamVjdEluc2VydGVyIGluc2VydGVyLAorCQkJUmV2V2FsayBydywgT2JqZWN0SWQgdHJlZUlkKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uIHsKKwkJT2JqZWN0SWQgaGVhZElkID0gcmVwby5yZXNvbHZlKHRhcmdldEJyYW5jaCArICJee2NvbW1pdH0iKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaGVhZElkICE9IG51bGwKKwkJCQkmJiBydy5wYXJzZUNvbW1pdChoZWFkSWQpLmdldFRyZWUoKS5nZXRJZCgpLmVxdWFscyh0cmVlSWQpKSB7CisJCQkvLyBObyBjaGFuZ2UuIERvIG5vdGhpbmcuCisJCQlyZXR1cm4gcncucGFyc2VDb21taXQoaGVhZElkKTsKKwkJfQorCisJCUNvbW1pdEJ1aWxkZXIgY29tbWl0ID0gbmV3IENvbW1pdEJ1aWxkZXIoKTsKKwkJY29tbWl0LnNldFRyZWVJZCh0cmVlSWQpOworCQlpZiAoaGVhZElkICE9IG51bGwpIHsKKwkJCWNvbW1pdC5zZXRQYXJlbnRJZHMoaGVhZElkKTsKKwkJfQorCQljb21taXQuc2V0QXV0aG9yKGF1dGhvcik7CisJCWNvbW1pdC5zZXRDb21taXR0ZXIoYXV0aG9yKTsKKwkJY29tbWl0LnNldE1lc3NhZ2UoUmVwb1RleHQuZ2V0KCkucmVwb0NvbW1pdE1lc3NhZ2UpOworCisJCU9iamVjdElkIGNvbW1pdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KGNvbW1pdCk7CisJCWluc2VydGVyLmZsdXNoKCk7CisKKwkJUmVmVXBkYXRlIHJ1ID0gcmVwby51cGRhdGVSZWYodGFyZ2V0QnJhbmNoKTsKKwkJcnUuc2V0TmV3T2JqZWN0SWQoY29tbWl0SWQpOworCQlydS5zZXRFeHBlY3RlZE9sZE9iamVjdElkKGhlYWRJZCAhPSBudWxsID8gaGVhZElkIDogT2JqZWN0SWQuemVyb0lkKCkpOworCQlSZXN1bHQgcmMgPSBydS51cGRhdGUocncpOworCQlzd2l0Y2ggKHJjKSB7CisJCWNhc2UgTkVXOgorCQljYXNlIEZPUkNFRDoKKwkJY2FzZSBGQVNUX0ZPUldBUkQ6CisJCQkvLyBTdWNjZXNzZnVsLiBEbyBub3RoaW5nLgorCQkJYnJlYWs7CisJCWNhc2UgUkVKRUNURUQ6CisJCWNhc2UgTE9DS19GQUlMVVJFOgorCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCUpHaXRUZXh0LmdldCgpLmNhbm5vdExvY2ssIHRhcmdldEJyYW5jaCksIHJ1LmdldFJlZigpLCByYyk7CisJCWRlZmF1bHQ6CisJCQl0aHJvdyBuZXcgSkdpdEludGVybmFsRXhjZXB0aW9uKAorCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS51cGRhdGluZ1JlZkZhaWxlZCwKKwkJCQkJCQl0YXJnZXRCcmFuY2gsIGNvbW1pdElkLm5hbWUoKSwgcmMpKTsKKwkJfQorCisJCXJldHVybiBydy5wYXJzZUNvbW1pdChjb21taXRJZCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlZ3VsYXJTdXBlcnByb2plY3RXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZWd1bGFyU3VwZXJwcm9qZWN0V3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhYjk5NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZWd1bGFyU3VwZXJwcm9qZWN0V3JpdGVyLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEsIEdvb2dsZSBJbmMuIGFuZCBvdGhlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfUkVNT1RFUzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuU3VibW9kdWxlQWRkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvQ29tbWFuZC5NYW5pZmVzdEVycm9yRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvUHJvamVjdC5Db3B5RmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uUmVwb1Byb2plY3QuTGlua0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLmludGVybmFsLlJlcG9UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CisKKy8qKgorICogV3JpdGVzIC5naXRtb2R1bGVzIGFuZCBnaXRsaW5rcyBvZiBwYXJzZWQgbWFuaWZlc3QgcHJvamVjdHMgaW50byBhIHJlZ3VsYXIKKyAqIHJlcG9zaXRvcnkgKHVzaW5nIGdpdCBzdWJtb2R1bGUgY29tbWFuZHMpCisgKgorICogVG8gd3JpdGUgb24gYSBiYXJlIHJlcG9zaXRvcnksIHVzZSB7QGxpbmsgQmFyZVN1cGVycHJvamVjdFdyaXRlcn0KKyAqLworY2xhc3MgUmVndWxhclN1cGVycHJvamVjdFdyaXRlciB7CisKKwlwcml2YXRlIFJlcG9zaXRvcnkgcmVwbzsKKworCXByaXZhdGUgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7CisKKwlSZWd1bGFyU3VwZXJwcm9qZWN0V3JpdGVyKFJlcG9zaXRvcnkgcmVwbywgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJdGhpcy5yZXBvID0gcmVwbzsKKwkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKKwl9CisKKwlSZXZDb21taXQgd3JpdGUoTGlzdDxSZXBvUHJvamVjdD4gcmVwb1Byb2plY3RzKQorCQkJdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQocmVwbykpIHsKKwkJCWZvciAoUmVwb1Byb2plY3QgcHJvaiA6IHJlcG9Qcm9qZWN0cykgeworCQkJCWFkZFN1Ym1vZHVsZShwcm9qLmdldE5hbWUoKSwgcHJvai5nZXRVcmwoKSwgcHJvai5nZXRQYXRoKCksCisJCQkJCQlwcm9qLmdldFJldmlzaW9uKCksIHByb2ouZ2V0Q29weUZpbGVzKCksCisJCQkJCQlwcm9qLmdldExpbmtGaWxlcygpLCBnaXQpOworCQkJfQorCQkJcmV0dXJuIGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKFJlcG9UZXh0LmdldCgpLnJlcG9Db21taXRNZXNzYWdlKQorCQkJCQkuY2FsbCgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgTWFuaWZlc3RFcnJvckV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBhZGRTdWJtb2R1bGUoU3RyaW5nIG5hbWUsIFN0cmluZyB1cmwsIFN0cmluZyBwYXRoLAorCQkJU3RyaW5nIHJldmlzaW9uLCBMaXN0PENvcHlGaWxlPiBjb3B5ZmlsZXMsIExpc3Q8TGlua0ZpbGU+IGxpbmtmaWxlcywKKwkJCUdpdCBnaXQpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJYXNzZXJ0ICghcmVwby5pc0JhcmUoKSk7CisJCWFzc2VydCAoZ2l0ICE9IG51bGwpOworCQlpZiAoIWxpbmtmaWxlcy5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKwkJCQkJSkdpdFRleHQuZ2V0KCkubm9uQmFyZUxpbmtGaWxlc05vdFN1cHBvcnRlZCk7CisJCX0KKworCQlTdWJtb2R1bGVBZGRDb21tYW5kIGFkZCA9IGdpdC5zdWJtb2R1bGVBZGQoKS5zZXROYW1lKG5hbWUpLnNldFBhdGgocGF0aCkKKwkJCQkuc2V0VVJJKHVybCk7CisJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCWFkZC5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7CisJCX0KKworCQlSZXBvc2l0b3J5IHN1YlJlcG8gPSBhZGQuY2FsbCgpOworCQlpZiAocmV2aXNpb24gIT0gbnVsbCkgeworCQkJdHJ5IChHaXQgc3ViID0gbmV3IEdpdChzdWJSZXBvKSkgeworCQkJCXN1Yi5jaGVja291dCgpLnNldE5hbWUoZmluZFJlZihyZXZpc2lvbiwgc3ViUmVwbykpLmNhbGwoKTsKKwkJCX0KKwkJCXN1YlJlcG8uY2xvc2UoKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihwYXRoKS5jYWxsKCk7CisJCX0KKwkJZm9yIChDb3B5RmlsZSBjb3B5ZmlsZSA6IGNvcHlmaWxlcykgeworCQkJY29weWZpbGUuY29weSgpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKGNvcHlmaWxlLmRlc3QpLmNhbGwoKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kUmVmKFN0cmluZyByZWYsIFJlcG9zaXRvcnkgcmVwbykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmICghT2JqZWN0SWQuaXNJZChyZWYpKSB7CisJCQlSZWYgciA9IHJlcG8uZXhhY3RSZWYoUl9SRU1PVEVTICsgREVGQVVMVF9SRU1PVEVfTkFNRSArICIvIiArIHJlZik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChyICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gci5nZXROYW1lKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlZjsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhCmluZGV4IGUwYTgyMjQuLjZlOTQzZTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhCkBAIC05LDExICs5LDYgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfUkVNT1RFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfVEFHUzsKLQogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMzEsMzQgKzI2LDIxIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5TdWJtb2R1bGVBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5Db25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkludmFsaWRSZWZOYW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5KR2l0SW50ZXJuYWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZS5EaXJDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLkJhcmVTdXBlcnByb2plY3RXcml0ZXIuRXh0cmFDb250ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5NYW5pZmVzdFBhcnNlci5JbmNsdWRlZEZpbGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLlJlcG9Qcm9qZWN0LkNvcHlGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwby5SZXBvUHJvamVjdC5MaW5rRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uaW50ZXJuYWwuUmVwb1RleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SW5zZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlLlJlc3VsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOwogCkBAIC04MCwxMiArNjIsNyBAQAogICogQHNpbmNlIDMuNAogICovCiBwdWJsaWMgY2xhc3MgUmVwb0NvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPFJldkNvbW1pdD4gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX0ZBSUxVUkVfTUFYX1JFVFJJRVMgPSA1OwogCi0JLy8gUmV0cnkgZXhwb25lbnRpYWxseSB3aXRoIGRlbGF5cyBpbiB0aGlzIHJhbmdlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPQ0tfRkFJTFVSRV9NSU5fUkVUUllfREVMQVlfTUlMTElTID0gNTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19GQUlMVVJFX01BWF9SRVRSWV9ERUxBWV9NSUxMSVMgPSA1MDAwOwogCiAJcHJpdmF0ZSBTdHJpbmcgbWFuaWZlc3RQYXRoOwogCXByaXZhdGUgU3RyaW5nIGJhc2VVcmk7CkBAIC05MywxNyArNzAsMTggQEAgcHVibGljIGNsYXNzIFJlcG9Db21tYW5kIGV4dGVuZHMgR2l0Q29tbWFuZDxSZXZDb21taXQ+IHsKIAlwcml2YXRlIFN0cmluZyBncm91cHNQYXJhbTsKIAlwcml2YXRlIFN0cmluZyBicmFuY2g7CiAJcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0QnJhbmNoID0gQ29uc3RhbnRzLkhFQUQ7Ci0JcHJpdmF0ZSBib29sZWFuIHJlY29yZFJlbW90ZUJyYW5jaCA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIHJlY29yZFN1Ym1vZHVsZUxhYmVscyA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIHJlY29yZFNoYWxsb3dTdWJtb2R1bGVzID0gdHJ1ZTsKIAlwcml2YXRlIFBlcnNvbklkZW50IGF1dGhvcjsKIAlwcml2YXRlIFJlbW90ZVJlYWRlciBjYWxsYmFjazsKIAlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtOwogCXByaXZhdGUgSW5jbHVkZWRGaWxlUmVhZGVyIGluY2x1ZGVkUmVhZGVyOwotCXByaXZhdGUgYm9vbGVhbiBpZ25vcmVSZW1vdGVGYWlsdXJlcyA9IGZhbHNlOworCisJcHJpdmF0ZSBCYXJlU3VwZXJwcm9qZWN0V3JpdGVyLkJhcmVXcml0ZXJDb25maWcgYmFyZVdyaXRlckNvbmZpZyA9IEJhcmVTdXBlcnByb2plY3RXcml0ZXIuQmFyZVdyaXRlckNvbmZpZworCQkJLmdldERlZmF1bHQoKTsKIAogCXByaXZhdGUgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7CiAKKwlwcml2YXRlIGZpbmFsIExpc3Q8RXh0cmFDb250ZW50PiBleHRyYUNvbnRlbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKIAkvKioKIAkgKiBBIGNhbGxiYWNrIHRvIGdldCByZWYgc2hhMSBvZiBhIHJlcG9zaXRvcnkgZnJvbSBpdHMgdXJpLgogCSAqCkBAIC0yNjksMTQgKzI0NywxNCBAQCBwdWJsaWMgUmVtb3RlRmlsZSByZWFkRmlsZVdpdGhNb2RlKFN0cmluZyB1cmksIFN0cmluZyByZWYsIFN0cmluZyBwYXRoKQogCX0KIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hbmlmZXN0RXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBHaXRBUElFeGNlcHRpb24geworCXN0YXRpYyBjbGFzcyBNYW5pZmVzdEVycm9yRXhjZXB0aW9uIGV4dGVuZHMgR2l0QVBJRXhjZXB0aW9uIHsKIAkJTWFuaWZlc3RFcnJvckV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKIAkJCXN1cGVyKFJlcG9UZXh0LmdldCgpLmludmFsaWRNYW5pZmVzdCwgY2F1c2UpOwogCQl9CiAJfQogCiAJQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVtb3RlVW5hdmFpbGFibGVFeGNlcHRpb24gZXh0ZW5kcyBHaXRBUElFeGNlcHRpb24geworCXN0YXRpYyBjbGFzcyBSZW1vdGVVbmF2YWlsYWJsZUV4Y2VwdGlvbiBleHRlbmRzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCVJlbW90ZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFN0cmluZyB1cmkpIHsKIAkJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlcG9UZXh0LmdldCgpLmVycm9yUmVtb3RlVW5hdmFpbGFibGUsIHVyaSkpOwogCQl9CkBAIC00MjEsNyArMzk5LDcgQEAgcHVibGljIFJlcG9Db21tYW5kIHNldFRhcmdldEJyYW5jaChTdHJpbmcgYnJhbmNoKSB7CiAJICogQHNpbmNlIDQuMgogCSAqLwogCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRSZWNvcmRSZW1vdGVCcmFuY2goYm9vbGVhbiBlbmFibGUpIHsKLQkJdGhpcy5yZWNvcmRSZW1vdGVCcmFuY2ggPSBlbmFibGU7CisJCXRoaXMuYmFyZVdyaXRlckNvbmZpZy5yZWNvcmRSZW1vdGVCcmFuY2ggPSBlbmFibGU7CiAJCXJldHVybiB0aGlzOwogCX0KIApAQCAtNDM2LDcgKzQxNCw3IEBAIHB1YmxpYyBSZXBvQ29tbWFuZCBzZXRSZWNvcmRSZW1vdGVCcmFuY2goYm9vbGVhbiBlbmFibGUpIHsKIAkgKiBAc2luY2UgNC40CiAJICovCiAJcHVibGljIFJlcG9Db21tYW5kIHNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyhib29sZWFuIGVuYWJsZSkgewotCQl0aGlzLnJlY29yZFN1Ym1vZHVsZUxhYmVscyA9IGVuYWJsZTsKKwkJdGhpcy5iYXJlV3JpdGVyQ29uZmlnLnJlY29yZFN1Ym1vZHVsZUxhYmVscyA9IGVuYWJsZTsKIAkJcmV0dXJuIHRoaXM7CiAJfQogCkBAIC00NTEsNyArNDI5LDcgQEAgcHVibGljIFJlcG9Db21tYW5kIHNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyhib29sZWFuIGVuYWJsZSkgewogCSAqIEBzaW5jZSA0LjQKIAkgKi8KIAlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UmVjb21tZW5kU2hhbGxvdyhib29sZWFuIGVuYWJsZSkgewotCQl0aGlzLnJlY29yZFNoYWxsb3dTdWJtb2R1bGVzID0gZW5hYmxlOworCQl0aGlzLmJhcmVXcml0ZXJDb25maWcucmVjb3JkU2hhbGxvd1N1Ym1vZHVsZXMgPSBlbmFibGU7CiAJCXJldHVybiB0aGlzOwogCX0KIApAQCAtNDg1LDcgKzQ2Myw3IEBAIHB1YmxpYyBSZXBvQ29tbWFuZCBzZXRQcm9ncmVzc01vbml0b3IoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkgKiBAc2luY2UgNC4zCiAJICovCiAJcHVibGljIFJlcG9Db21tYW5kIHNldElnbm9yZVJlbW90ZUZhaWx1cmVzKGJvb2xlYW4gaWdub3JlKSB7Ci0JCXRoaXMuaWdub3JlUmVtb3RlRmFpbHVyZXMgPSBpZ25vcmU7CisJCXRoaXMuYmFyZVdyaXRlckNvbmZpZy5pZ25vcmVSZW1vdGVGYWlsdXJlcyA9IGlnbm9yZTsKIAkJcmV0dXJuIHRoaXM7CiAJfQogCkBAIC01MzQsNiArNTEyLDIyIEBAIHB1YmxpYyBSZXBvQ29tbWFuZCBzZXRJbmNsdWRlZEZpbGVSZWFkZXIoSW5jbHVkZWRGaWxlUmVhZGVyIHJlYWRlcikgewogCQlyZXR1cm4gdGhpczsKIAl9CiAKKwkvKioKKwkgKiBDcmVhdGUgYSBmaWxlIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgaW4gdGhlIGRlc3RpbmF0aW9uIHJlcG9zaXRvcnkKKwkgKgorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICB3aGVyZSB0byBjcmVhdGUgdGhlIGZpbGUgaW4gdGhlIGRlc3RpbmF0aW9uIHJlcG9zaXRvcnkKKwkgKiBAcGFyYW0gY29udGVudHMKKwkgKiAgICAgICAgICAgIGNvbnRlbnQgZm9yIHRoZSBjcmVhdGUgZmlsZQorCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFJlcG9Db21tYW5kIGFkZFRvRGVzdGluYXRpb24oU3RyaW5nIHBhdGgsIFN0cmluZyBjb250ZW50cykgeworCQl0aGlzLmV4dHJhQ29udGVudHMuYWRkKG5ldyBFeHRyYUNvbnRlbnQocGF0aCwgY29udGVudHMpKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgUmV2Q29tbWl0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKQEAgLTU3MCwyNDAgKzU2NCwxOCBAQCBwdWJsaWMgUmV2Q29tbWl0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKIAkJfQogCiAJCWlmIChyZXBvLmlzQmFyZSgpKSB7Ci0JCQlpZiAoYXV0aG9yID09IG51bGwpCi0JCQkJYXV0aG9yID0gbmV3IFBlcnNvbklkZW50KHJlcG8pOwotCQkJaWYgKGNhbGxiYWNrID09IG51bGwpCi0JCQkJY2FsbGJhY2sgPSBuZXcgRGVmYXVsdFJlbW90ZVJlYWRlcigpOwogCQkJTGlzdDxSZXBvUHJvamVjdD4gcmVuYW1lZFByb2plY3RzID0gcmVuYW1lUHJvamVjdHMoZmlsdGVyZWRQcm9qZWN0cyk7Ci0KLQkJCURpckNhY2hlIGluZGV4ID0gRGlyQ2FjaGUubmV3SW5Db3JlKCk7Ci0JCQlPYmplY3RJbnNlcnRlciBpbnNlcnRlciA9IHJlcG8ubmV3T2JqZWN0SW5zZXJ0ZXIoKTsKLQotCQkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsocmVwbykpIHsKLQkJCQlwcmVwYXJlSW5kZXgocmVuYW1lZFByb2plY3RzLCBpbmRleCwgaW5zZXJ0ZXIpOwotCQkJCU9iamVjdElkIHRyZWVJZCA9IGluZGV4LndyaXRlVHJlZShpbnNlcnRlcik7Ci0JCQkJbG9uZyBwcmV2RGVsYXkgPSAwOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgTE9DS19GQUlMVVJFX01BWF9SRVRSSUVTIC0gMTsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXR1cm4gY29tbWl0VHJlZU9uQ3VycmVudFRpcCgKLQkJCQkJCQlpbnNlcnRlciwgcncsIHRyZWVJZCk7Ci0JCQkJCX0gY2F0Y2ggKENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24gZSkgewotCQkJCQkJcHJldkRlbGF5ID0gRmlsZVV0aWxzLmRlbGF5KHByZXZEZWxheSwKLQkJCQkJCQkJTE9DS19GQUlMVVJFX01JTl9SRVRSWV9ERUxBWV9NSUxMSVMsCi0JCQkJCQkJCUxPQ0tfRkFJTFVSRV9NQVhfUkVUUllfREVMQVlfTUlMTElTKTsKLQkJCQkJCVRocmVhZC5zbGVlcChwcmV2RGVsYXkpOwotCQkJCQkJcmVwby5nZXRSZWZEYXRhYmFzZSgpLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBJbiB0aGUgbGFzdCB0cnksIGp1c3QgcHJvcGFnYXRlIHRoZSBleGNlcHRpb25zCi0JCQkJcmV0dXJuIGNvbW1pdFRyZWVPbkN1cnJlbnRUaXAoaW5zZXJ0ZXIsIHJ3LCB0cmVlSWQpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IE1hbmlmZXN0RXJyb3JFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChyZXBvKSkgewotCQkJZm9yIChSZXBvUHJvamVjdCBwcm9qIDogZmlsdGVyZWRQcm9qZWN0cykgewotCQkJCWFkZFN1Ym1vZHVsZShwcm9qLmdldE5hbWUoKSwgcHJvai5nZXRVcmwoKSwgcHJvai5nZXRQYXRoKCksCi0JCQkJCQlwcm9qLmdldFJldmlzaW9uKCksIHByb2ouZ2V0Q29weUZpbGVzKCksCi0JCQkJCQlwcm9qLmdldExpbmtGaWxlcygpLCBnaXQpOwotCQkJfQotCQkJcmV0dXJuIGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKFJlcG9UZXh0LmdldCgpLnJlcG9Db21taXRNZXNzYWdlKQotCQkJCQkuY2FsbCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTWFuaWZlc3RFcnJvckV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVwYXJlSW5kZXgoTGlzdDxSZXBvUHJvamVjdD4gcHJvamVjdHMsIERpckNhY2hlIGluZGV4LAotCQkJT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgR2l0QVBJRXhjZXB0aW9uIHsKLQkJQ29uZmlnIGNmZyA9IG5ldyBDb25maWcoKTsKLQkJU3RyaW5nQnVpbGRlciBhdHRyaWJ1dGVzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJRGlyQ2FjaGVCdWlsZGVyIGJ1aWxkZXIgPSBpbmRleC5idWlsZGVyKCk7Ci0JCWZvciAoUmVwb1Byb2plY3QgcHJvaiA6IHByb2plY3RzKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHByb2ouZ2V0TmFtZSgpOwotCQkJU3RyaW5nIHBhdGggPSBwcm9qLmdldFBhdGgoKTsKLQkJCVN0cmluZyB1cmwgPSBwcm9qLmdldFVybCgpOwotCQkJT2JqZWN0SWQgb2JqZWN0SWQ7Ci0JCQlpZiAoT2JqZWN0SWQuaXNJZChwcm9qLmdldFJldmlzaW9uKCkpKSB7Ci0JCQkJb2JqZWN0SWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKHByb2ouZ2V0UmV2aXNpb24oKSk7Ci0JCQl9IGVsc2UgewotCQkJCW9iamVjdElkID0gY2FsbGJhY2suc2hhMSh1cmwsIHByb2ouZ2V0UmV2aXNpb24oKSk7Ci0JCQkJaWYgKG9iamVjdElkID09IG51bGwgJiYgIWlnbm9yZVJlbW90ZUZhaWx1cmVzKSB7Ci0JCQkJCXRocm93IG5ldyBSZW1vdGVVbmF2YWlsYWJsZUV4Y2VwdGlvbih1cmwpOwotCQkJCX0KLQkJCQlpZiAocmVjb3JkUmVtb3RlQnJhbmNoKSB7Ci0JCQkJCS8vICJicmFuY2giIGZpZWxkIGlzIG9ubHkgZm9yIG5vbi10YWcgcmVmZXJlbmNlcy4KLQkJCQkJLy8gS2VlcCB0YWdzIGluICJyZWYiIGZpZWxkIGFzIGhpbnQgZm9yIG90aGVyIHRvb2xzLgotCQkJCQlTdHJpbmcgZmllbGQgPSBwcm9qLmdldFJldmlzaW9uKCkuc3RhcnRzV2l0aChSX1RBR1MpID8gInJlZiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCTogImJyYW5jaCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY2ZnLnNldFN0cmluZygic3VibW9kdWxlIiwgbmFtZSwgZmllbGQsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlwcm9qLmdldFJldmlzaW9uKCkpOwotCQkJCX0KLQotCQkJCWlmIChyZWNvcmRTaGFsbG93U3VibW9kdWxlcwotCQkJCQkJJiYgcHJvai5nZXRSZWNvbW1lbmRTaGFsbG93KCkgIT0gbnVsbCkgewotCQkJCQkvLyBUaGUgc2hhbGxvdyByZWNvbW1lbmRhdGlvbiBpcyBsb3NpbmcgaW5mb3JtYXRpb24uCi0JCQkJCS8vIEFzIHRoZSByZXBvIG1hbmlmZXN0cyBzdG9yZXMgdGhlIHJlY29tbWVuZGVkCi0JCQkJCS8vIGRlcHRoIGluIHRoZSAnY2xvbmUtZGVwdGgnIGZpZWxkLCB3aGlsZQotCQkJCQkvLyBnaXQgY29yZSBvbmx5IHVzZXMgYSBiaW5hcnkgJ3NoYWxsb3cgPSB0cnVlL2ZhbHNlJwotCQkJCQkvLyBoaW50LCB3ZSdsbCBtYXAgYW55IGRlcHRoIHRvICdzaGFsbG93ID0gdHJ1ZScKLQkJCQkJY2ZnLnNldEJvb2xlYW4oInN1Ym1vZHVsZSIsIG5hbWUsICJzaGFsbG93IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlY29yZFN1Ym1vZHVsZUxhYmVscykgewotCQkJCVN0cmluZ0J1aWxkZXIgcmVjID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCQlyZWMuYXBwZW5kKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZWMuYXBwZW5kKHBhdGgpOwotCQkJCWZvciAoU3RyaW5nIGdyb3VwIDogcHJvai5nZXRHcm91cHMoKSkgewotCQkJCQlyZWMuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVjLmFwcGVuZChncm91cCk7Ci0JCQkJfQotCQkJCXJlYy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlhdHRyaWJ1dGVzLmFwcGVuZChyZWMudG9TdHJpbmcoKSk7Ci0JCQl9Ci0KLQkJCVVSSSBzdWJtb2RVcmwgPSBVUkkuY3JlYXRlKHVybCk7Ci0JCQlpZiAodGFyZ2V0VXJpICE9IG51bGwpIHsKLQkJCQlzdWJtb2RVcmwgPSByZWxhdGl2aXplKHRhcmdldFVyaSwgc3VibW9kVXJsKTsKLQkJCX0KLQkJCWNmZy5zZXRTdHJpbmcoInN1Ym1vZHVsZSIsIG5hbWUsICJwYXRoIiwgcGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJY2ZnLnNldFN0cmluZygic3VibW9kdWxlIiwgbmFtZSwgInVybCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlzdWJtb2RVcmwudG9TdHJpbmcoKSk7Ci0KLQkJCS8vIGNyZWF0ZSBnaXRsaW5rCi0JCQlpZiAob2JqZWN0SWQgIT0gbnVsbCkgewotCQkJCURpckNhY2hlRW50cnkgZGNFbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KHBhdGgpOwotCQkJCWRjRW50cnkuc2V0T2JqZWN0SWQob2JqZWN0SWQpOwotCQkJCWRjRW50cnkuc2V0RmlsZU1vZGUoRmlsZU1vZGUuR0lUTElOSyk7Ci0JCQkJYnVpbGRlci5hZGQoZGNFbnRyeSk7Ci0KLQkJCQlmb3IgKENvcHlGaWxlIGNvcHlmaWxlIDogcHJvai5nZXRDb3B5RmlsZXMoKSkgewotCQkJCQlSZW1vdGVGaWxlIHJmID0gY2FsbGJhY2sucmVhZEZpbGVXaXRoTW9kZSh1cmwsCi0JCQkJCQkJcHJvai5nZXRSZXZpc2lvbigpLCBjb3B5ZmlsZS5zcmMpOwotCQkJCQlvYmplY3RJZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCi0JCQkJCQkJcmYuZ2V0Q29udGVudHMoKSk7Ci0JCQkJCWRjRW50cnkgPSBuZXcgRGlyQ2FjaGVFbnRyeShjb3B5ZmlsZS5kZXN0KTsKLQkJCQkJZGNFbnRyeS5zZXRPYmplY3RJZChvYmplY3RJZCk7Ci0JCQkJCWRjRW50cnkuc2V0RmlsZU1vZGUocmYuZ2V0RmlsZU1vZGUoKSk7Ci0JCQkJCWJ1aWxkZXIuYWRkKGRjRW50cnkpOwotCQkJCX0KLQkJCQlmb3IgKExpbmtGaWxlIGxpbmtmaWxlIDogcHJvai5nZXRMaW5rRmlsZXMoKSkgewotCQkJCQlTdHJpbmcgbGluazsKLQkJCQkJaWYgKGxpbmtmaWxlLmRlc3QuY29udGFpbnMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlsaW5rID0gRmlsZVV0aWxzLnJlbGF0aXZpemVHaXRQYXRoKAotCQkJCQkJCQlsaW5rZmlsZS5kZXN0LnN1YnN0cmluZygwLAotCQkJCQkJCQkJCWxpbmtmaWxlLmRlc3QubGFzdEluZGV4T2YoJy8nKSksCi0JCQkJCQkJCXByb2ouZ2V0UGF0aCgpICsgIi8iICsgbGlua2ZpbGUuc3JjKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJbGluayA9IHByb2ouZ2V0UGF0aCgpICsgIi8iICsgbGlua2ZpbGUuc3JjOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQlvYmplY3RJZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCi0JCQkJCQkJbGluay5nZXRCeXRlcyhVVEZfOCkpOwotCQkJCQlkY0VudHJ5ID0gbmV3IERpckNhY2hlRW50cnkobGlua2ZpbGUuZGVzdCk7Ci0JCQkJCWRjRW50cnkuc2V0T2JqZWN0SWQob2JqZWN0SWQpOwotCQkJCQlkY0VudHJ5LnNldEZpbGVNb2RlKEZpbGVNb2RlLlNZTUxJTkspOwotCQkJCQlidWlsZGVyLmFkZChkY0VudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGNvbnRlbnQgPSBjZmcudG9UZXh0KCk7Ci0KLQkJLy8gY3JlYXRlIGEgbmV3IERpckNhY2hlRW50cnkgZm9yIC5naXRtb2R1bGVzIGZpbGUuCi0JCURpckNhY2hlRW50cnkgZGNFbnRyeSA9IG5ldyBEaXJDYWNoZUVudHJ5KAotCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOwotCQlPYmplY3RJZCBvYmplY3RJZCA9IGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsCi0JCQkJY29udGVudC5nZXRCeXRlcyhVVEZfOCkpOwotCQlkY0VudHJ5LnNldE9iamVjdElkKG9iamVjdElkKTsKLQkJZGNFbnRyeS5zZXRGaWxlTW9kZShGaWxlTW9kZS5SRUdVTEFSX0ZJTEUpOwotCQlidWlsZGVyLmFkZChkY0VudHJ5KTsKLQotCQlpZiAocmVjb3JkU3VibW9kdWxlTGFiZWxzKSB7Ci0JCQkvLyBjcmVhdGUgYSBuZXcgRGlyQ2FjaGVFbnRyeSBmb3IgLmdpdGF0dHJpYnV0ZXMgZmlsZS4KLQkJCURpckNhY2hlRW50cnkgZGNFbnRyeUF0dHIgPSBuZXcgRGlyQ2FjaGVFbnRyeSgKLQkJCQkJQ29uc3RhbnRzLkRPVF9HSVRfQVRUUklCVVRFUyk7Ci0JCQlPYmplY3RJZCBhdHRySWQgPSBpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLAotCQkJCQlhdHRyaWJ1dGVzLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJCWRjRW50cnlBdHRyLnNldE9iamVjdElkKGF0dHJJZCk7Ci0JCQlkY0VudHJ5QXR0ci5zZXRGaWxlTW9kZShGaWxlTW9kZS5SRUdVTEFSX0ZJTEUpOwotCQkJYnVpbGRlci5hZGQoZGNFbnRyeUF0dHIpOworCQkJQmFyZVN1cGVycHJvamVjdFdyaXRlciB3cml0ZXIgPSBuZXcgQmFyZVN1cGVycHJvamVjdFdyaXRlcihyZXBvLCB0YXJnZXRVcmksCisJCQkJCXRhcmdldEJyYW5jaCwKKwkJCQkJYXV0aG9yID09IG51bGwgPyBuZXcgUGVyc29uSWRlbnQocmVwbykgOiBhdXRob3IsCisJCQkJCWNhbGxiYWNrID09IG51bGwgPyBuZXcgRGVmYXVsdFJlbW90ZVJlYWRlcigpIDogY2FsbGJhY2ssCisJCQkJCWJhcmVXcml0ZXJDb25maWcsIGV4dHJhQ29udGVudHMpOworCQkJcmV0dXJuIHdyaXRlci53cml0ZShyZW5hbWVkUHJvamVjdHMpOwogCQl9CiAKLQkJYnVpbGRlci5maW5pc2goKTsKLQl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBjb21taXRUcmVlT25DdXJyZW50VGlwKE9iamVjdEluc2VydGVyIGluc2VydGVyLAotCQkJUmV2V2FsayBydywgT2JqZWN0SWQgdHJlZUlkKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uIHsKLQkJT2JqZWN0SWQgaGVhZElkID0gcmVwby5yZXNvbHZlKHRhcmdldEJyYW5jaCArICJee2NvbW1pdH0iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaGVhZElkICE9IG51bGwgJiYgcncucGFyc2VDb21taXQoaGVhZElkKS5nZXRUcmVlKCkuZ2V0SWQoKS5lcXVhbHModHJlZUlkKSkgewotCQkJLy8gTm8gY2hhbmdlLiBEbyBub3RoaW5nLgotCQkJcmV0dXJuIHJ3LnBhcnNlQ29tbWl0KGhlYWRJZCk7Ci0JCX0KLQotCQlDb21taXRCdWlsZGVyIGNvbW1pdCA9IG5ldyBDb21taXRCdWlsZGVyKCk7Ci0JCWNvbW1pdC5zZXRUcmVlSWQodHJlZUlkKTsKLQkJaWYgKGhlYWRJZCAhPSBudWxsKQotCQkJY29tbWl0LnNldFBhcmVudElkcyhoZWFkSWQpOwotCQljb21taXQuc2V0QXV0aG9yKGF1dGhvcik7Ci0JCWNvbW1pdC5zZXRDb21taXR0ZXIoYXV0aG9yKTsKLQkJY29tbWl0LnNldE1lc3NhZ2UoUmVwb1RleHQuZ2V0KCkucmVwb0NvbW1pdE1lc3NhZ2UpOwotCi0JCU9iamVjdElkIGNvbW1pdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KGNvbW1pdCk7Ci0JCWluc2VydGVyLmZsdXNoKCk7Ci0KLQkJUmVmVXBkYXRlIHJ1ID0gcmVwby51cGRhdGVSZWYodGFyZ2V0QnJhbmNoKTsKLQkJcnUuc2V0TmV3T2JqZWN0SWQoY29tbWl0SWQpOwotCQlydS5zZXRFeHBlY3RlZE9sZE9iamVjdElkKGhlYWRJZCAhPSBudWxsID8gaGVhZElkIDogT2JqZWN0SWQuemVyb0lkKCkpOwotCQlSZXN1bHQgcmMgPSBydS51cGRhdGUocncpOwotCQlzd2l0Y2ggKHJjKSB7Ci0JCQljYXNlIE5FVzoKLQkJCWNhc2UgRk9SQ0VEOgotCQkJY2FzZSBGQVNUX0ZPUldBUkQ6Ci0JCQkJLy8gU3VjY2Vzc2Z1bC4gRG8gbm90aGluZy4KLQkJCQlicmVhazsKLQkJCWNhc2UgUkVKRUNURUQ6Ci0JCQljYXNlIExPQ0tfRkFJTFVSRToKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudFJlZlVwZGF0ZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0Ci0JCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmNhbm5vdExvY2ssIHRhcmdldEJyYW5jaCksCi0JCQkJCQlydS5nZXRSZWYoKSwgcmMpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSkdpdEludGVybmFsRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJSkdpdFRleHQuZ2V0KCkudXBkYXRpbmdSZWZGYWlsZWQsCi0JCQkJCQl0YXJnZXRCcmFuY2gsIGNvbW1pdElkLm5hbWUoKSwgcmMpKTsKLQkJfQotCi0JCXJldHVybiBydy5wYXJzZUNvbW1pdChjb21taXRJZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFN1Ym1vZHVsZShTdHJpbmcgbmFtZSwgU3RyaW5nIHVybCwgU3RyaW5nIHBhdGgsCi0JCQlTdHJpbmcgcmV2aXNpb24sIExpc3Q8Q29weUZpbGU+IGNvcHlmaWxlcywgTGlzdDxMaW5rRmlsZT4gbGlua2ZpbGVzLAotCQkJR2l0IGdpdCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlhc3NlcnQgKCFyZXBvLmlzQmFyZSgpKTsKLQkJYXNzZXJ0IChnaXQgIT0gbnVsbCk7Ci0JCWlmICghbGlua2ZpbGVzLmlzRW1wdHkoKSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotCQkJCQlKR2l0VGV4dC5nZXQoKS5ub25CYXJlTGlua0ZpbGVzTm90U3VwcG9ydGVkKTsKLQkJfQotCi0JCVN1Ym1vZHVsZUFkZENvbW1hbmQgYWRkID0gZ2l0LnN1Ym1vZHVsZUFkZCgpLnNldE5hbWUobmFtZSkuc2V0UGF0aChwYXRoKQotCQkJCS5zZXRVUkkodXJsKTsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCWFkZC5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0KLQkJUmVwb3NpdG9yeSBzdWJSZXBvID0gYWRkLmNhbGwoKTsKLQkJaWYgKHJldmlzaW9uICE9IG51bGwpIHsKLQkJCXRyeSAoR2l0IHN1YiA9IG5ldyBHaXQoc3ViUmVwbykpIHsKLQkJCQlzdWIuY2hlY2tvdXQoKS5zZXROYW1lKGZpbmRSZWYocmV2aXNpb24sIHN1YlJlcG8pKS5jYWxsKCk7Ci0JCQl9Ci0JCQlzdWJSZXBvLmNsb3NlKCk7Ci0JCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4ocGF0aCkuY2FsbCgpOwotCQl9Ci0JCWZvciAoQ29weUZpbGUgY29weWZpbGUgOiBjb3B5ZmlsZXMpIHsKLQkJCWNvcHlmaWxlLmNvcHkoKTsKLQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihjb3B5ZmlsZS5kZXN0KS5jYWxsKCk7Ci0JCX0KKwkJUmVndWxhclN1cGVycHJvamVjdFdyaXRlciB3cml0ZXIgPSBuZXcgUmVndWxhclN1cGVycHJvamVjdFdyaXRlcihyZXBvLCBtb25pdG9yKTsKKwkJcmV0dXJuIHdyaXRlci53cml0ZShmaWx0ZXJlZFByb2plY3RzKTsKIAl9CiAKIAkvKioKQEAgLTkxMCwxMyArNjgyLDQgQEAgc3RhdGljIFVSSSByZWxhdGl2aXplKFVSSSBjdXJyZW50LCBVUkkgdGFyZ2V0KSB7CiAJCXJldHVybiBVUkkuY3JlYXRlKGoudG9TdHJpbmcoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmRSZWYoU3RyaW5nIHJlZiwgUmVwb3NpdG9yeSByZXBvKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCFPYmplY3RJZC5pc0lkKHJlZikpIHsKLQkJCVJlZiByID0gcmVwby5leGFjdFJlZihSX1JFTU9URVMgKyBERUZBVUxUX1JFTU9URV9OQU1FICsgIi8iICsgcmVmKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gci5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlZjsKLQl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEKaW5kZXggNDdiYjgwYS4uYTljZDlmOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YQpAQCAtMzg5LDYgKzM4OSw4IEBAIHB1YmxpYyBzdGF0aWMgSkdpdFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW5NZW1vcnlCdWZmZXJMaW1pdEV4Y2VlZGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW5wdXREaWRudE1hdGNoTGVuZ3RoOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW5wdXRTdHJlYW1NdXN0U3VwcG9ydE1hcms7CisJLyoqKi8gcHVibGljIFN0cmluZyBpbnRlZ2VyVmFsdWVOb3RJblJhbmdlOworCS8qKiovIHB1YmxpYyBTdHJpbmcgaW50ZWdlclZhbHVlTm90SW5SYW5nZVN1YlNlY3Rpb247CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnRlZ2VyVmFsdWVPdXRPZlJhbmdlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW50ZXJuYWxSZXZpc2lvbkVycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW50ZXJuYWxTZXJ2ZXJFcnJvcjsKQEAgLTQwMCw2ICs0MDIsNyBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRCb29sZWFuVmFsdWU7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkQ2hhbm5lbDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRDb21taXRQYXJlbnROdW1iZXI7CisJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkQ29yZUFiYnJldjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWREZXB0aDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRFbmNvZGluZzsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRFbmNyeXB0aW9uOwpAQCAtNjAxLDYgKzYwNCwxMSBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hDZXJ0aWZpY2F0ZUludmFsaWRGaWVsZFZhbHVlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaENlcnRpZmljYXRlSW52YWxpZEhlYWRlcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hDZXJ0aWZpY2F0ZUludmFsaWRTaWduYXR1cmU7CisJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoRGVmYXVsdE5vdGhpbmc7CisJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoRGVmYXVsdE5vVXBzdHJlYW07CisJLyoqKi8gcHVibGljIFN0cmluZyBwdXNoRGVmYXVsdFNpbXBsZTsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hEZWZhdWx0VHJpYW5ndWxhclVwc3RyZWFtOworCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaERlZmF1bHRVbmtub3duOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaElzTm90U3VwcG9ydGVkRm9yQnVuZGxlVHJhbnNwb3J0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgcHVzaE5vdFBlcm1pdHRlZDsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHB1c2hPcHRpb25zTm90U3VwcG9ydGVkOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0NvbW1hbmRMaW5lRGlmZlRvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Db21tYW5kTGluZURpZmZUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5NTE1YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Db21tYW5kTGluZURpZmZUb29sLmphdmEKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMSwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sOworCisvKioKKyAqIFByZS1kZWZpbmVkIGNvbW1hbmQgbGluZSBkaWZmIHRvb2xzLgorICoKKyAqIEFkZHMgc2FtZSBkaWZmIHRvb2xzIGFzIGFsc28gcHJlLWRlZmluZWQgaW4gQy1HaXQKKyAqIDxwPgorICogc2VlICJnaXQtY29yZVxtZXJnZXRvb2xzXCIKKyAqIDwvcD4KKyAqIDxwPgorICogc2VlIGxpbmtzIHRvIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gZm9yIHRoZSB0b29scworICogPC9wPgorICoKKyAqIDxwcmU+CisgKiBhcmF4aXMKKyAqIGJjCisgKiBiYzMKKyAqIGNvZGVjb21wYXJlCisgKiBkZWx0YXdhbGtlcgorICogZGlmZm1lcmdlCisgKiBkaWZmdXNlCisgKiBlY21lcmdlCisgKiBlbWVyZ2UKKyAqIGV4YW1kaWZmCisgKiBndWlmZnkKKyAqIGd2aW1kaWZmCisgKiBndmltZGlmZjIKKyAqIGd2aW1kaWZmMworICoga2RpZmYzCisgKiBrb21wYXJlCisgKiBtZWxkCisgKiBvcGVuZGlmZgorICogcDRtZXJnZQorICogdGtkaWZmCisgKiB2aW1kaWZmCisgKiB2aW1kaWZmMgorICogdmltZGlmZjMKKyAqIHdpbm1lcmdlCisgKiB4eGRpZmYKKyAqIDwvcHJlPgorICoKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCitwdWJsaWMgZW51bSBDb21tYW5kTGluZURpZmZUb29sIHsKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHBzOi8vd3d3LmFyYXhpcy5jb20vbWVyZ2UvZG9jdW1lbnRhdGlvbi13aW5kb3dzL2NvbW1hbmQtbGluZS5lbiI+aHR0cHM6Ly93d3cuYXJheGlzLmNvbS9tZXJnZS9kb2N1bWVudGF0aW9uLXdpbmRvd3MvY29tbWFuZC1saW5lLmVuPC9hPgorCSAqLworCWFyYXhpcygiY29tcGFyZSIsICItd2FpdCAtMiBcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5zY29vdGVyc29mdHdhcmUuY29tL3Y0aGVscC9pbmRleC5odG1sP2NvbW1hbmRfbGluZV9yZWZlcmVuY2UuaHRtbCI+aHR0cHM6Ly93d3cuc2Nvb3RlcnNvZnR3YXJlLmNvbS92NGhlbHAvaW5kZXguaHRtbD9jb21tYW5kX2xpbmVfcmVmZXJlbmNlLmh0bWw8L2E+CisJICovCisJYmMoImJjb21wIiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHBzOi8vd3d3LnNjb290ZXJzb2Z0d2FyZS5jb20vdjRoZWxwL2luZGV4Lmh0bWw/Y29tbWFuZF9saW5lX3JlZmVyZW5jZS5odG1sIj5odHRwczovL3d3dy5zY29vdGVyc29mdHdhcmUuY29tL3Y0aGVscC9pbmRleC5odG1sP2NvbW1hbmRfbGluZV9yZWZlcmVuY2UuaHRtbDwvYT4KKwkgKi8KKwliYzMoImJjb21wYXJlIiwgYmMpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly93d3cuZGV2YXJ0LmNvbS9jb2RlY29tcGFyZS9kb2NzL2luZGV4Lmh0bWw/Y29tcGFyaW5nX3ZpYV9jb21tYW5kX2xpbmUuaHRtIj5odHRwczovL3d3dy5kZXZhcnQuY29tL2NvZGVjb21wYXJlL2RvY3MvaW5kZXguaHRtbD9jb21wYXJpbmdfdmlhX2NvbW1hbmRfbGluZS5odG08L2E+CisJICovCisJY29kZWNvbXBhcmUoIkNvZGVDb21wYXJlIiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHBzOi8vd3d3LmRlbHRhd2Fsa2VyLmNvbS9pbnRlZ3JhdGUvY29tbWFuZC1saW5lIj5odHRwczovL3d3dy5kZWx0YXdhbGtlci5jb20vaW50ZWdyYXRlL2NvbW1hbmQtbGluZTwvYT4KKwkgKi8KKwlkZWx0YXdhbGtlcigiRGVsdGFXYWxrZXIiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly9zb3VyY2VnZWFyLmNvbS9kaWZmbWVyZ2Uvd2ViaGVscC9zZWNfX2NsYXJnc19fZGlmZi5odG1sIj5odHRwczovL3NvdXJjZWdlYXIuY29tL2RpZmZtZXJnZS93ZWJoZWxwL3NlY19fY2xhcmdzX19kaWZmLmh0bWw8L2E+CisJICovCisJZGlmZm1lcmdlKCJkaWZmbWVyZ2UiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL2RpZmZ1c2Uuc291cmNlZm9yZ2UubmV0L21hbnVhbC5odG1sI2ludHJvZHVjdGlvbi11c2FnZSI+aHR0cDovL2RpZmZ1c2Uuc291cmNlZm9yZ2UubmV0L21hbnVhbC5odG1sI2ludHJvZHVjdGlvbi11c2FnZTwvYT4KKwkgKi8KKwlkaWZmdXNlKCJkaWZmdXNlIiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly93d3cuZWxsaWVjb21wdXRpbmcuY29tL2VuL09ubGluZURvYy9lY21lcmdlX2VuLzQ0MjA1MTY3LmFzcCI+aHR0cDovL3d3dy5lbGxpZWNvbXB1dGluZy5jb20vZW4vT25saW5lRG9jL2VjbWVyZ2VfZW4vNDQyMDUxNjcuYXNwPC9hPgorCSAqLworCWVjbWVyZ2UoImVjbWVyZ2UiLCAiLS1kZWZhdWx0IC0tbW9kZT1kaWZmMiBcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2VtYWNzL21hbnVhbC9odG1sX25vZGUvZW1hY3MvT3ZlcnZpZXctb2YtRW1lcmdlLmh0bWwiPmh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZW1hY3MvbWFudWFsL2h0bWxfbm9kZS9lbWFjcy9PdmVydmlldy1vZi1FbWVyZ2UuaHRtbDwvYT4KKwkgKi8KKwllbWVyZ2UoImVtYWNzIiwgIi1mIGVtZXJnZS1maWxlcy1jb21tYW5kIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHBzOi8vd3d3LnByZXN0b3NvZnQuY29tL3BzLmFzcD9wYWdlPWh0bWxoZWxwL2VkcC9jb21tYW5kX2xpbmVfb3B0aW9ucyI+aHR0cHM6Ly93d3cucHJlc3Rvc29mdC5jb20vcHMuYXNwP3BhZ2U9aHRtbGhlbHAvZWRwL2NvbW1hbmRfbGluZV9vcHRpb25zPC9hPgorCSAqLworCWV4YW1kaWZmKCJFeGFtRGlmZiIsICJcIiRMT0NBTFwiIFwiJFJFTU9URVwiIC1uaCIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly93d3cuZ3VpZmZ5LmNvbS9oZWxwL0d1aWZmeUhlbHAvR3VpZmZ5Q21kLmh0bWwiPmh0dHBzOi8vd3d3Lmd1aWZmeS5jb20vaGVscC9HdWlmZnlIZWxwL0d1aWZmeUNtZC5odG1sPC9hPgorCSAqLworCWd1aWZmeSgiZ3VpZmZ5IiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sIj5odHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbDwvYT4KKwkgKi8KKwlndmltZGlmZigiZ3ZpZXdkaWZmIiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sIj5odHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbDwvYT4KKwkgKi8KKwlndmltZGlmZjIoZ3ZpbWRpZmYpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL3ZpbWRvYy5zb3VyY2Vmb3JnZS5uZXQvaHRtbGRvYy9kaWZmLmh0bWwiPmh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sPC9hPgorCSAqLworCWd2aW1kaWZmMyhndmltZGlmZiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwOi8va2RpZmYzLnNvdXJjZWZvcmdlLm5ldC9kb2MvZG9jdW1lbnRhdGlvbi5odG1sIj5odHRwOi8va2RpZmYzLnNvdXJjZWZvcmdlLm5ldC9kb2MvZG9jdW1lbnRhdGlvbi5odG1sPC9hPgorCSAqLworCWtkaWZmMygia2RpZmYzIiwKKwkJCSItLUwxIFwiJE1FUkdFRCAoQSlcIiAtLUwyIFwiJE1FUkdFRCAoQilcIiBcIiRMT0NBTFwiIFwiJFJFTU9URVwiIiksCisJLyoqCisJICogU2VlOiA8YSBocmVmPQorCSAqICJodHRwczovL2RvY3Mua2RlLm9yZy90cnVuazUvZW4va2Rlc2RrL2tvbXBhcmUvY29tbWFuZGxpbmUtb3B0aW9ucy5odG1sIj5odHRwczovL2RvY3Mua2RlLm9yZy90cnVuazUvZW4va2Rlc2RrL2tvbXBhcmUvY29tbWFuZGxpbmUtb3B0aW9ucy5odG1sPC9hPgorCSAqLworCWtvbXBhcmUoImtvbXBhcmUiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAidHRwOi8vbWVsZG1lcmdlLm9yZy9oZWxwL2ZpbGUtbW9kZS5odG1sIj5odHRwOi8vbWVsZG1lcmdlLm9yZy9oZWxwL2ZpbGUtbW9kZS5odG1sPC9hPgorCSAqLworCW1lbGQoIm1lbGQiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL3d3dy5tYW5wYWdlei5jb20vbWFuLzEvb3BlbmRpZmYvIj5odHRwOi8vd3d3Lm1hbnBhZ2V6LmNvbS9tYW4vMS9vcGVuZGlmZi88L2E+CisJICogPHA+CisJICogSGludDogY2hlY2sgdGhlICcgfCBjYXQnIGZvciB0aGUgY2FsbAorCSAqIDwvcD4KKwkgKi8KKwlvcGVuZGlmZigib3BlbmRpZmYiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cHM6Ly93d3cucGVyZm9yY2UuY29tL21hbnVhbHMvdjE1LjEvY21kcmVmL3A0X21lcmdlLmh0bWwiPmh0dHBzOi8vd3d3LnBlcmZvcmNlLmNvbS9tYW51YWxzL3YxNS4xL2NtZHJlZi9wNF9tZXJnZS5odG1sPC9hPgorCSAqLworCXA0bWVyZ2UoInA0bWVyZ2UiLCAiXCIkTE9DQUxcIiBcIiRSRU1PVEVcIiIpLAorCS8qKgorCSAqIFNlZTogPGEgaHJlZj0KKwkgKiAiaHR0cDovL2xpbnV4Lm1hdGgudGlmci5yZXMuaW4vbWFudWFscy9tYW4vdGtkaWZmLmh0bWwiPmh0dHA6Ly9saW51eC5tYXRoLnRpZnIucmVzLmluL21hbnVhbHMvbWFuL3RrZGlmZi5odG1sPC9hPgorCSAqLworCXRrZGlmZigidGtkaWZmIiwgIlwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sIj5odHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbDwvYT4KKwkgKi8KKwl2aW1kaWZmKCJ2aWV3ZGlmZiIsIGd2aW1kaWZmKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sIj5odHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbDwvYT4KKwkgKi8KKwl2aW1kaWZmMih2aW1kaWZmKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly92aW1kb2Muc291cmNlZm9yZ2UubmV0L2h0bWxkb2MvZGlmZi5odG1sIj5odHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2RpZmYuaHRtbDwvYT4KKwkgKi8KKwl2aW1kaWZmMyh2aW1kaWZmKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly9tYW51YWwud2lubWVyZ2Uub3JnL0NvbW1hbmRfbGluZS5odG1sIj5odHRwOi8vbWFudWFsLndpbm1lcmdlLm9yZy9Db21tYW5kX2xpbmUuaHRtbDwvYT4KKwkgKiA8cD4KKwkgKiBIaW50OiBjaGVjayBob3cgJ21lcmdldG9vbF9maW5kX3dpbjMyX2NtZCAiV2luTWVyZ2VVLmV4ZSIgIldpbk1lcmdlIicKKwkgKiB3b3JrcworCSAqIDwvcD4KKwkgKi8KKwl3aW5tZXJnZSgiV2luTWVyZ2VVIiwgIi11IC1lIFwiJExPQ0FMXCIgXCIkUkVNT1RFXCIiKSwKKwkvKioKKwkgKiBTZWU6IDxhIGhyZWY9CisJICogImh0dHA6Ly9mdXJpdXMuY2EveHhkaWZmL2RvYy94eGRpZmYtZG9jLmh0bWwiPmh0dHA6Ly9mdXJpdXMuY2EveHhkaWZmL2RvYy94eGRpZmYtZG9jLmh0bWw8L2E+CisJICovCisJeHhkaWZmKCJ4eGRpZmYiLAorCQkJIi1SICdBY2NlbC5TZWFyY2g6IFwiQ3RybCtGXCInIC1SICdBY2NlbC5TZWFyY2hGb3J3YXJkOiBcIkN0cmwrR1wiJyBcIiRMT0NBTFwiIFwiJFJFTU9URVwiIik7CisKKwlDb21tYW5kTGluZURpZmZUb29sKFN0cmluZyBwYXRoLCBTdHJpbmcgcGFyYW1ldGVycykgeworCQl0aGlzLnBhdGggPSBwYXRoOworCQl0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworCX0KKworCUNvbW1hbmRMaW5lRGlmZlRvb2woQ29tbWFuZExpbmVEaWZmVG9vbCBmcm9tKSB7CisJCXRoaXMoZnJvbS5nZXRQYXRoKCksIGZyb20uZ2V0UGFyYW1ldGVycygpKTsKKwl9CisKKwlDb21tYW5kTGluZURpZmZUb29sKFN0cmluZyBwYXRoLCBDb21tYW5kTGluZURpZmZUb29sIGZyb20pIHsKKwkJdGhpcyhwYXRoLCBmcm9tLmdldFBhcmFtZXRlcnMoKSk7CisJfQorCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGF0aDsKKworCXByaXZhdGUgZmluYWwgU3RyaW5nIHBhcmFtZXRlcnM7CisKKwkvKioKKwkgKiBAcmV0dXJuIHBhdGgKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisJCXJldHVybiBwYXRoOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gcGFyYW1ldGVycyBhcyBvbmUgc3RyaW5nCisJICovCisJcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJzKCkgeworCQlyZXR1cm4gcGFyYW1ldGVyczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9EaWZmVG9vbENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0RpZmZUb29sQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxZjYzNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9EaWZmVG9vbENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0RJRkZUT09MX1NFQ1RJT047CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfRElGRl9TRUNUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9DTUQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0dVSVRPT0w7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1BBVEg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1BST01QVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVE9PTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVFJVU1RfRVhJVF9DT0RFOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZy5TZWN0aW9uUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLmludGVybmFsLkJvb2xlYW5UcmlTdGF0ZTsKKworLyoqCisgKiBLZWVwcyB0cmFjayBvZiBkaWZmdG9vbCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAqLworcHVibGljIGNsYXNzIERpZmZUb29sQ29uZmlnIHsKKworCS8qKiBLZXkgZm9yIHtAbGluayBDb25maWcjZ2V0KFNlY3Rpb25QYXJzZXIpfS4gKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbmZpZy5TZWN0aW9uUGFyc2VyPERpZmZUb29sQ29uZmlnPiBLRVkgPSBEaWZmVG9vbENvbmZpZzo6bmV3OworCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdG9vbE5hbWU7CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBndWlUb29sTmFtZTsKKworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBwcm9tcHQ7CisKKwlwcml2YXRlIGZpbmFsIEJvb2xlYW5UcmlTdGF0ZSB0cnVzdEV4aXRDb2RlOworCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiB0b29sczsKKworCXByaXZhdGUgRGlmZlRvb2xDb25maWcoQ29uZmlnIHJjKSB7CisJCXRvb2xOYW1lID0gcmMuZ2V0U3RyaW5nKENPTkZJR19ESUZGX1NFQ1RJT04sIG51bGwsIENPTkZJR19LRVlfVE9PTCk7CisJCWd1aVRvb2xOYW1lID0gcmMuZ2V0U3RyaW5nKENPTkZJR19ESUZGX1NFQ1RJT04sIG51bGwsCisJCQkJQ09ORklHX0tFWV9HVUlUT09MKTsKKwkJcHJvbXB0ID0gcmMuZ2V0Qm9vbGVhbihDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgQ09ORklHX0tFWV9QUk9NUFQsCisJCQkJdHJ1ZSk7CisJCVN0cmluZyB0cnVzdFN0ciA9IHJjLmdldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgbnVsbCwKKwkJCQlDT05GSUdfS0VZX1RSVVNUX0VYSVRfQ09ERSk7CisJCWlmICh0cnVzdFN0ciAhPSBudWxsKSB7CisJCQl0cnVzdEV4aXRDb2RlID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4odHJ1c3RTdHIpCisJCQkJCT8gQm9vbGVhblRyaVN0YXRlLlRSVUUKKwkJCQkJOiBCb29sZWFuVHJpU3RhdGUuRkFMU0U7CisJCX0gZWxzZSB7CisJCQl0cnVzdEV4aXRDb2RlID0gQm9vbGVhblRyaVN0YXRlLlVOU0VUOworCQl9CisJCXRvb2xzID0gbmV3IEhhc2hNYXA8PigpOworCQlTZXQ8U3RyaW5nPiBzdWJzZWN0aW9ucyA9IHJjLmdldFN1YnNlY3Rpb25zKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OKTsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IHN1YnNlY3Rpb25zKSB7CisJCQlTdHJpbmcgY21kID0gcmMuZ2V0U3RyaW5nKENPTkZJR19ESUZGVE9PTF9TRUNUSU9OLCBuYW1lLAorCQkJCQlDT05GSUdfS0VZX0NNRCk7CisJCQlTdHJpbmcgcGF0aCA9IHJjLmdldFN0cmluZyhDT05GSUdfRElGRlRPT0xfU0VDVElPTiwgbmFtZSwKKwkJCQkJQ09ORklHX0tFWV9QQVRIKTsKKwkJCWlmICgoY21kICE9IG51bGwpIHx8IChwYXRoICE9IG51bGwpKSB7CisJCQkJdG9vbHMucHV0KG5hbWUsIG5ldyBVc2VyRGVmaW5lZERpZmZUb29sKG5hbWUsIHBhdGgsIGNtZCkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgZGVmYXVsdCBkaWZmIHRvb2wgbmFtZSAoZGlmZi50b29sKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRvb2xOYW1lKCkgeworCQlyZXR1cm4gdG9vbE5hbWU7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgZGVmYXVsdCBHVUkgZGlmZiB0b29sIG5hbWUgKGRpZmYuZ3VpdG9vbCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRHdWlUb29sTmFtZSgpIHsKKwkJcmV0dXJuIGd1aVRvb2xOYW1lOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRpZmYgdG9vbCAicHJvbXB0IiBvcHRpb24gKGRpZmZ0b29sLnByb21wdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1Byb21wdCgpIHsKKwkJcmV0dXJuIHByb21wdDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBkaWZmIHRvb2wgInRydXN0IGV4aXQgY29kZSIgb3B0aW9uIChkaWZmdG9vbC50cnVzdEV4aXRDb2RlKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVHJ1c3RFeGl0Q29kZSgpIHsKKwkJcmV0dXJuIHRydXN0RXhpdENvZGUgPT0gQm9vbGVhblRyaVN0YXRlLlRSVUU7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgdG9vbHMgbWFwCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IGdldFRvb2xzKCkgeworCQlyZXR1cm4gdG9vbHM7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgdG9vbCBuYW1lcworCSAqLworCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRUb29sTmFtZXMoKSB7CisJCXJldHVybiB0b29scy5rZXlTZXQoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRGlmZlRvb2xzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvRGlmZlRvb2xzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3MjlhNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9EaWZmVG9vbHMuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIxLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbC5Cb29sZWFuVHJpU3RhdGU7CisKKy8qKgorICogTWFuYWdlcyBkaWZmIHRvb2xzLgorICovCitwdWJsaWMgY2xhc3MgRGlmZlRvb2xzIHsKKworCXByaXZhdGUgZmluYWwgRGlmZlRvb2xDb25maWcgY29uZmlnOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBwcmVkZWZpbmVkVG9vbHM7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEV4dGVybmFsRGlmZlRvb2w+IHVzZXJEZWZpbmVkVG9vbHM7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBleHRlcm5hbCBkaWZmLXRvb2xzIG1hbmFnZXIgZm9yIGdpdmVuIHJlcG9zaXRvcnkuCisJICoKKwkgKiBAcGFyYW0gcmVwbworCSAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkKKwkgKi8KKwlwdWJsaWMgRGlmZlRvb2xzKFJlcG9zaXRvcnkgcmVwbykgeworCQljb25maWcgPSByZXBvLmdldENvbmZpZygpLmdldChEaWZmVG9vbENvbmZpZy5LRVkpOworCQlzZXR1cFByZWRlZmluZWRUb29scygpOworCQlzZXR1cFVzZXJEZWZpbmVkVG9vbHMoKTsKKwl9CisKKwkvKioKKwkgKiBDb21wYXJlIHR3byB2ZXJzaW9ucyBvZiBhIGZpbGUuCisJICoKKwkgKiBAcGFyYW0gbmV3UGF0aAorCSAqICAgICAgICAgICAgdGhlIG5ldyBmaWxlIHBhdGgKKwkgKiBAcGFyYW0gb2xkUGF0aAorCSAqICAgICAgICAgICAgdGhlIG9sZCBmaWxlIHBhdGgKKwkgKiBAcGFyYW0gbmV3SWQKKwkgKiAgICAgICAgICAgIHRoZSBuZXcgb2JqZWN0IElECisJICogQHBhcmFtIG9sZElkCisJICogICAgICAgICAgICB0aGUgb2xkIG9iamVjdCBJRAorCSAqIEBwYXJhbSB0b29sTmFtZQorCSAqICAgICAgICAgICAgdGhlIHNlbGVjdGVkIHRvb2wgbmFtZSAoY2FuIGJlIG51bGwpCisJICogQHBhcmFtIHByb21wdAorCSAqICAgICAgICAgICAgdGhlIHByb21wdCBvcHRpb24KKwkgKiBAcGFyYW0gZ3VpCisJICogICAgICAgICAgICB0aGUgR1VJIG9wdGlvbgorCSAqIEBwYXJhbSB0cnVzdEV4aXRDb2RlCisJICogICAgICAgICAgICB0aGUgInRydXN0IGV4aXQgY29kZSIgb3B0aW9uCisJICogQHJldHVybiB0aGUgcmV0dXJuIGNvZGUgZnJvbSBleGVjdXRlZCB0b29sCisJICovCisJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBuZXdQYXRoLCBTdHJpbmcgb2xkUGF0aCwgU3RyaW5nIG5ld0lkLAorCQkJU3RyaW5nIG9sZElkLCBTdHJpbmcgdG9vbE5hbWUsIEJvb2xlYW5UcmlTdGF0ZSBwcm9tcHQsCisJCQlCb29sZWFuVHJpU3RhdGUgZ3VpLCBCb29sZWFuVHJpU3RhdGUgdHJ1c3RFeGl0Q29kZSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0b29sIG5hbWVzCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldFRvb2xOYW1lcygpIHsKKwkJcmV0dXJuIGNvbmZpZy5nZXRUb29sTmFtZXMoKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB1c2VyIGRlZmluZWQgdG9vbHMKKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gZ2V0VXNlckRlZmluZWRUb29scygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh1c2VyRGVmaW5lZFRvb2xzKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBhdmFpbGFibGUgcHJlZGVmaW5lZCB0b29scworCSAqLworCXB1YmxpYyBNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBnZXRBdmFpbGFibGVUb29scygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChwcmVkZWZpbmVkVG9vbHMpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIE5PVCBhdmFpbGFibGUgcHJlZGVmaW5lZCB0b29scworCSAqLworCXB1YmxpYyBNYXA8U3RyaW5nLCBFeHRlcm5hbERpZmZUb29sPiBnZXROb3RBdmFpbGFibGVUb29scygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChuZXcgVHJlZU1hcDw+KCkpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBndWkKKwkgKiAgICAgICAgICAgIHVzZSB0aGUgZGlmZi5ndWl0b29sIHNldHRpbmcgPworCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdG9vbCBuYW1lCisJICovCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VG9vbE5hbWUoQm9vbGVhblRyaVN0YXRlIGd1aSkgeworCQlyZXR1cm4gZ3VpICE9IEJvb2xlYW5UcmlTdGF0ZS5VTlNFVCA/ICJteV9ndWlfdG9vbCIgLy8kTk9OLU5MUy0xJAorCQkJCTogIm15X2RlZmF1bHRfdG9vbG5hbWUiOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogQHJldHVybiBpcyBpbnRlcmFjdGl2ZSAoY29uZmlnIHByb21wdCBlbmFibGVkKSA/CisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbnRlcmFjdGl2ZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgdm9pZCBzZXR1cFByZWRlZmluZWRUb29scygpIHsKKwkJcHJlZGVmaW5lZFRvb2xzID0gbmV3IFRyZWVNYXA8PigpOworCQlmb3IgKENvbW1hbmRMaW5lRGlmZlRvb2wgdG9vbCA6IENvbW1hbmRMaW5lRGlmZlRvb2wudmFsdWVzKCkpIHsKKwkJCXByZWRlZmluZWRUb29scy5wdXQodG9vbC5uYW1lKCksIG5ldyBQcmVEZWZpbmVkRGlmZlRvb2wodG9vbCkpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldHVwVXNlckRlZmluZWRUb29scygpIHsKKwkJdXNlckRlZmluZWRUb29scyA9IG5ldyBUcmVlTWFwPD4oKTsKKwkJTWFwPFN0cmluZywgRXh0ZXJuYWxEaWZmVG9vbD4gdXNlclRvb2xzID0gY29uZmlnLmdldFRvb2xzKCk7CisJCWZvciAoU3RyaW5nIG5hbWUgOiB1c2VyVG9vbHMua2V5U2V0KCkpIHsKKwkJCUV4dGVybmFsRGlmZlRvb2wgdXNlclRvb2wgPSB1c2VyVG9vbHMuZ2V0KG5hbWUpOworCQkJLy8gaWYgZGlmZnRvb2wuPG5hbWU+LmNtZCBpcyBkZWZpbmVkIHdlIGhhdmUgdXNlciBkZWZpbmVkIHRvb2wKKwkJCWlmICh1c2VyVG9vbC5nZXRDb21tYW5kKCkgIT0gbnVsbCkgeworCQkJCXVzZXJEZWZpbmVkVG9vbHMucHV0KG5hbWUsIHVzZXJUb29sKTsKKwkJCX0gZWxzZSBpZiAodXNlclRvb2wuZ2V0UGF0aCgpICE9IG51bGwpIHsKKwkJCQkvLyBpZiBkaWZmdG9vbC48bmFtZT4ucGF0aCBpcyBkZWZpbmVkIHdlIGp1c3Qgb3ZlcmxvYWQgdGhlIHBhdGgKKwkJCQkvLyBvZiBwcmVkZWZpbmVkIHRvb2wKKwkJCQlQcmVEZWZpbmVkRGlmZlRvb2wgcHJlZGVmVG9vbCA9IChQcmVEZWZpbmVkRGlmZlRvb2wpIHByZWRlZmluZWRUb29scworCQkJCQkJLmdldChuYW1lKTsKKwkJCQlpZiAocHJlZGVmVG9vbCAhPSBudWxsKSB7CisJCQkJCXByZWRlZlRvb2wuc2V0UGF0aCh1c2VyVG9vbC5nZXRQYXRoKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL0V4dGVybmFsRGlmZlRvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbERpZmZUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkN2U4MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9FeHRlcm5hbERpZmZUb29sLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIxLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLmRpZmZtZXJnZXRvb2w7CisKKy8qKgorICogVGhlIGV4dGVybmFsIHRvb2wgaW50ZXJmYWNlLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEV4dGVybmFsRGlmZlRvb2wgeworCisJLyoqCisJICogQHJldHVybiB0aGUgdG9vbCBuYW1lCisJICovCisJU3RyaW5nIGdldE5hbWUoKTsKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHRvb2wgcGF0aAorCSAqLworCVN0cmluZyBnZXRQYXRoKCk7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSB0b29sIGNvbW1hbmQKKwkgKi8KKwlTdHJpbmcgZ2V0Q29tbWFuZCgpOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvUHJlRGVmaW5lZERpZmZUb29sLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2RpZmZtZXJnZXRvb2wvUHJlRGVmaW5lZERpZmZUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2OWZiNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9QcmVEZWZpbmVkRGlmZlRvb2wuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjEsIEFuZHJlIEJvc3NlcnQgPGFuZHJlLmJvc3NlcnRAc2llbWVucy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZGlmZm1lcmdldG9vbDsKKworLyoqCisgKiBUaGUgcHJlLWRlZmluZWQgZGlmZiB0b29sLgorICovCitwdWJsaWMgY2xhc3MgUHJlRGVmaW5lZERpZmZUb29sIGV4dGVuZHMgVXNlckRlZmluZWREaWZmVG9vbCB7CisKKwkvKioKKwkgKiBDcmVhdGUgYSBwcmUtZGVmaW5lZCBkaWZmIHRvb2wKKwkgKgorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZQorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICB0aGUgcGF0aAorCSAqIEBwYXJhbSBwYXJhbWV0ZXJzCisJICogICAgICAgICAgICB0aGUgdG9vbCBwYXJhbWV0ZXJzIGFzIG9uZSBzdHJpbmcgdGhhdCBpcyB1c2VkIHRvZ2V0aGVyIHdpdGgKKwkgKiAgICAgICAgICAgIHBhdGggYXMgY29tbWFuZAorCSAqLworCXB1YmxpYyBQcmVEZWZpbmVkRGlmZlRvb2woU3RyaW5nIG5hbWUsIFN0cmluZyBwYXRoLCBTdHJpbmcgcGFyYW1ldGVycykgeworCQlzdXBlcihuYW1lLCBwYXRoLCBwYXJhbWV0ZXJzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBwcmUtZGVmaW5lZCBkaWZmIHRvb2wKKwkgKgorCSAqIEBwYXJhbSB0b29sCisJICogICAgICAgICAgICB0aGUgY29tbWFuZCBsaW5lIGRpZmYgdG9vbAorCSAqCisJICovCisJcHVibGljIFByZURlZmluZWREaWZmVG9vbChDb21tYW5kTGluZURpZmZUb29sIHRvb2wpIHsKKwkJdGhpcyh0b29sLm5hbWUoKSwgdG9vbC5nZXRQYXRoKCksIHRvb2wuZ2V0UGFyYW1ldGVycygpKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcGF0aAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKwkJLy8gaGFuZGxpbmcgb2Ygc3BhY2VzIGluIHBhdGgKKwkJaWYgKHBhdGguY29udGFpbnMoIiAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkvLyBhZGQgcXVvdGVzIGJlZm9yZSBpZiBuZWVkZWQKKwkJCWlmICghcGF0aC5zdGFydHNXaXRoKCJcIiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlwYXRoID0gIlwiIiArIHBhdGg7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCS8vIGFkZCBxdW90ZXMgYWZ0ZXIgaWYgbmVlZGVkCisJCQlpZiAoIXBhdGguZW5kc1dpdGgoIlwiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXBhdGggPSBwYXRoICsgIlwiIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCXN1cGVyLnNldFBhdGgocGF0aCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqCisJICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGVkIHBhdGggYW5kIGNvbW1hbmQgb2YgdGhlIHByZS1kZWZpbmVkIGRpZmYgdG9vbAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWFuZCgpIHsKKwkJcmV0dXJuIGdldFBhdGgoKSArICIgIiArIHN1cGVyLmdldENvbW1hbmQoKTsgLy8kTk9OLU5MUy0xJAorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9kaWZmbWVyZ2V0b29sL1VzZXJEZWZpbmVkRGlmZlRvb2wuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Vc2VyRGVmaW5lZERpZmZUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyMjk2ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvZGlmZm1lcmdldG9vbC9Vc2VyRGVmaW5lZERpZmZUb29sLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMSwgQW5kcmUgQm9zc2VydCA8YW5kcmUuYm9zc2VydEBzaWVtZW5zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5kaWZmbWVyZ2V0b29sOworCisvKioKKyAqIFRoZSB1c2VyLWRlZmluZWQgZGlmZiB0b29sLgorICovCitwdWJsaWMgY2xhc3MgVXNlckRlZmluZWREaWZmVG9vbCBpbXBsZW1lbnRzIEV4dGVybmFsRGlmZlRvb2wgeworCisJLyoqCisJICogdGhlIGRpZmYgdG9vbCBuYW1lCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIHRoZSBkaWZmIHRvb2wgcGF0aAorCSAqLworCXByaXZhdGUgU3RyaW5nIHBhdGg7CisKKwkvKioKKwkgKiB0aGUgZGlmZiB0b29sIGNvbW1hbmQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBjbWQ7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBkaWZmIHRvb2wKKwkgKgorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZQorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICB0aGUgcGF0aAorCSAqIEBwYXJhbSBjbWQKKwkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kCisJICovCisJcHVibGljIFVzZXJEZWZpbmVkRGlmZlRvb2woU3RyaW5nIG5hbWUsIFN0cmluZyBwYXRoLCBTdHJpbmcgY21kKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMucGF0aCA9IHBhdGg7CisJCXRoaXMuY21kID0gY21kOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGRpZmYgdG9vbCBuYW1lCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgcGF0aCBvZiB0aGUgZGlmZiB0b29sLgorCSAqCisJICogPHA+CisJICogVGhlIHBhdGggdG8gYSBwcmUtZGVmaW5lZCBleHRlcm5hbCBkaWZmIHRvb2wgY2FuIGJlIG92ZXJyaWRkZW4gYnkKKwkgKiBzcGVjaWZ5aW5nIHtAY29kZSBkaWZmdG9vbC48dG9vbD4ucGF0aH0gaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuCisJICogPC9wPgorCSAqIDxwPgorCSAqIEZvciBhIHVzZXIgZGVmaW5lZCBkaWZmIHRvb2wgKHRoYXQgZG9lcyBub3Qgb3ZlcnJpZGUgYSBwcmUtZGVmaW5lZCBkaWZmCisJICogdG9vbCksIHRoZSBwYXRoIGlzIGlnbm9yZWQgd2hlbiBpbnZva2luZyB0aGUgdG9vbC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBkaWZmIHRvb2wgcGF0aAorCSAqCisJICogQHNlZSA8YSBocmVmPQorCSAqICAgICAgImh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtZGlmZnRvb2wiPmh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtZGlmZnRvb2w8L2E+CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworCQlyZXR1cm4gcGF0aDsKKwl9CisKKwkvKioKKwkgKiBUaGUgY29tbWFuZCBvZiB0aGUgZGlmZiB0b29sLgorCSAqCisJICogPHA+CisJICogQSBwcmUtZGVmaW5lZCBleHRlcm5hbCBkaWZmIHRvb2wgY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgdGhlIHRvb2xzIG5hbWUKKwkgKiBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZS4gVGhlIG92ZXJ3cml0dGVuIHRvb2wgaXMgdGhlbiBhIHVzZXIgZGVmaW5lZCB0b29sCisJICogYW5kIHRoZSBjb21tYW5kIG9mIHRoZSBkaWZmIHRvb2wgaXMgc3BlY2lmaWVkIHdpdGgKKwkgKiB7QGNvZGUgZGlmZnRvb2wuPHRvb2w+LmNtZH0uIFRoaXMgY29tbWFuZCBtdXN0IHdvcmsgd2l0aG91dCBwcmVwZW5kaW5nCisJICogdGhlIHZhbHVlIG9mIHtAbGluayAjZ2V0UGF0aCgpfSBhbmQgY2FuIHNvbWV0aW1lcyBpbmNsdWRlIHRvb2wKKwkgKiBwYXJhbWV0ZXJzLgorCSAqIDwvcD4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGRpZmYgdG9vbCBjb21tYW5kCisJICoKKwkgKiBAc2VlIDxhIGhyZWY9CisJICogICAgICAiaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1kaWZmdG9vbCI+aHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1kaWZmdG9vbDwvYT4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldENvbW1hbmQoKSB7CisJCXJldHVybiBjbWQ7CisJfQorCisJLyoqCisJICogT3ZlcnJpZGVzIHRoZSBwYXRoIGZvciB0aGUgZ2l2ZW4gdG9vbC4gRXF1aXZhbGVudCB0byBzZXR0aW5nCisJICoge0Bjb2RlIGRpZmZ0b29sLjx0b29sPi5wYXRofS4KKwkgKgorCSAqIEBwYXJhbSBwYXRoCisJICogICAgICAgICAgICB0aGUgbmV3IGRpZmYgdG9vbCBwYXRoCisJICoKKwkgKiBAc2VlIDxhIGhyZWY9CisJICogICAgICAiaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1kaWZmdG9vbCI+aHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1kaWZmdG9vbDwvYT4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisJCXRoaXMucGF0aCA9IHBhdGg7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGUuamF2YQppbmRleCA1NGM1MjdjLi5iMzBkNTA5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGUuamF2YQpAQCAtMTIsNiArMTIsMTAgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50aW1lLkR1cmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlQXJyYXk7CkBAIC0xNjYsNiArMTcwLDEyIEBAIHB1YmxpYyBzdGF0aWMgRGZzQmxvY2tDYWNoZSBnZXRJbnN0YW5jZSgpIHsKIAkvKiogTGltaXRzIG9mIGNhY2hlIGhvdCBjb3VudCBwZXIgcGFjayBmaWxlIGV4dGVuc2lvbi4gKi8KIAlwcml2YXRlIGZpbmFsIGludFtdIGNhY2hlSG90TGltaXRzID0gbmV3IGludFtQYWNrRXh0LnZhbHVlcygpLmxlbmd0aF07CiAKKwkvKiogQ29uc3VtZXIgb2YgbG9hZGluZyBhbmQgZXZpY3Rpb24gZXZlbnRzIG9mIGluZGV4ZXMuICovCisJcHJpdmF0ZSBmaW5hbCBEZnNCbG9ja0NhY2hlQ29uZmlnLkluZGV4RXZlbnRDb25zdW1lciBpbmRleEV2ZW50Q29uc3VtZXI7CisKKwkvKiogU3RvcmVzIHRpbWVzdGFtcHMgb2YgdGhlIGxhc3QgZXZpY3Rpb24gb2YgaW5kZXhlcy4gKi8KKwlwcml2YXRlIGZpbmFsIE1hcDxFdmljdEtleSwgTG9uZz4gaW5kZXhFdmljdGlvbk1hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlwcml2YXRlIERmc0Jsb2NrQ2FjaGUoRGZzQmxvY2tDYWNoZUNvbmZpZyBjZmcpIHsKIAkJdGFibGVTaXplID0gdGFibGVTaXplKGNmZyk7CkBAIC0yMTMsNiArMjIzLDcgQEAgcHJpdmF0ZSBEZnNCbG9ja0NhY2hlKERmc0Jsb2NrQ2FjaGVDb25maWcgY2ZnKSB7CiAJCQkJY2FjaGVIb3RMaW1pdHNbaV0gPSBEZnNCbG9ja0NhY2hlQ29uZmlnLkRFRkFVTFRfQ0FDSEVfSE9UX01BWDsKIAkJCX0KIAkJfQorCQlpbmRleEV2ZW50Q29uc3VtZXIgPSBjZmcuZ2V0SW5kZXhFdmVudENvbnN1bWVyKCk7CiAJfQogCiAJYm9vbGVhbiBzaG91bGRDb3B5VGhyb3VnaENhY2hlKGxvbmcgbGVuZ3RoKSB7CkBAIC00NjEsNiArNDcyLDcgQEAgcHJpdmF0ZSB2b2lkIHJlc2VydmVTcGFjZShsb25nIHJlc2VydmUsIERmc1N0cmVhbUtleSBrZXkpIHsKIAkJCQkJbGl2ZSAtPSBkZWFkLnNpemU7CiAJCQkJCWdldFN0YXQobGl2ZUJ5dGVzLCBkZWFkLmtleSkuYWRkQW5kR2V0KC1kZWFkLnNpemUpOwogCQkJCQlnZXRTdGF0KHN0YXRFdmljdCwgZGVhZC5rZXkpLmluY3JlbWVudEFuZEdldCgpOworCQkJCQlyZXBvcnRJbmRleEV2aWN0ZWQoZGVhZCk7CiAJCQkJfSB3aGlsZSAobWF4Qnl0ZXMgPCBsaXZlKTsKIAkJCQljbG9ja0hhbmQgPSBwcmV2OwogCQkJfQpAQCAtNTE1LDExICs1MjcsMTMgQEAgdm9pZCBwdXQoRGZzQmxvY2sgdikgewogCTxUPiBSZWY8VD4gZ2V0T3JMb2FkUmVmKAogCQkJRGZzU3RyZWFtS2V5IGtleSwgbG9uZyBwb3NpdGlvbiwgUmVmTG9hZGVyPFQ+IGxvYWRlcikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWxvbmcgc3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKIAkJaW50IHNsb3QgPSBzbG90KGtleSwgcG9zaXRpb24pOwogCQlIYXNoRW50cnkgZTEgPSB0YWJsZS5nZXQoc2xvdCk7CiAJCVJlZjxUPiByZWYgPSBzY2FuUmVmKGUxLCBrZXksIHBvc2l0aW9uKTsKIAkJaWYgKHJlZiAhPSBudWxsKSB7CiAJCQlnZXRTdGF0KHN0YXRIaXQsIGtleSkuaW5jcmVtZW50QW5kR2V0KCk7CisJCQlyZXBvcnRJbmRleFJlcXVlc3RlZChyZWYsIHRydWUgLyogY2FjaGVIaXQgKi8sIHN0YXJ0KTsKIAkJCXJldHVybiByZWY7CiAJCX0KIApAQCAtNTMyLDYgKzU0Niw4IEBAIDxUPiBSZWY8VD4gZ2V0T3JMb2FkUmVmKAogCQkJCXJlZiA9IHNjYW5SZWYoZTIsIGtleSwgcG9zaXRpb24pOwogCQkJCWlmIChyZWYgIT0gbnVsbCkgewogCQkJCQlnZXRTdGF0KHN0YXRIaXQsIGtleSkuaW5jcmVtZW50QW5kR2V0KCk7CisJCQkJCXJlcG9ydEluZGV4UmVxdWVzdGVkKHJlZiwgdHJ1ZSAvKiBjYWNoZUhpdCAqLywKKwkJCQkJCQlzdGFydCk7CiAJCQkJCXJldHVybiByZWY7CiAJCQkJfQogCQkJfQpAQCAtNTU2LDYgKzU3Miw3IEBAIDxUPiBSZWY8VD4gZ2V0T3JMb2FkUmVmKAogCQl9IGZpbmFsbHkgewogCQkJcmVnaW9uTG9jay51bmxvY2soKTsKIAkJfQorCQlyZXBvcnRJbmRleFJlcXVlc3RlZChyZWYsIGZhbHNlIC8qIGNhY2hlSGl0ICovLCBzdGFydCk7CiAJCXJldHVybiByZWY7CiAJfQogCkBAIC02ODIsOCArNjk5LDkgQEAgcHJpdmF0ZSBzdGF0aWMgQXRvbWljTG9uZyBnZXRTdGF0KEF0b21pY1JlZmVyZW5jZTxBdG9taWNMb25nW10+IHN0YXRzLAogCX0KIAogCXByaXZhdGUgc3RhdGljIEhhc2hFbnRyeSBjbGVhbihIYXNoRW50cnkgdG9wKSB7Ci0JCXdoaWxlICh0b3AgIT0gbnVsbCAmJiB0b3AucmVmLm5leHQgPT0gbnVsbCkKKwkJd2hpbGUgKHRvcCAhPSBudWxsICYmIHRvcC5yZWYubmV4dCA9PSBudWxsKSB7CiAJCQl0b3AgPSB0b3AubmV4dDsKKwkJfQogCQlpZiAodG9wID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CkBAIC02OTEsNiArNzA5LDQ0IEBAIHByaXZhdGUgc3RhdGljIEhhc2hFbnRyeSBjbGVhbihIYXNoRW50cnkgdG9wKSB7CiAJCXJldHVybiBuID09IHRvcC5uZXh0ID8gdG9wIDogbmV3IEhhc2hFbnRyeShuLCB0b3AucmVmKTsKIAl9CiAKKwlwcml2YXRlIHZvaWQgcmVwb3J0SW5kZXhSZXF1ZXN0ZWQoUmVmPD8+IHJlZiwgYm9vbGVhbiBjYWNoZUhpdCwKKwkJCWxvbmcgc3RhcnQpIHsKKwkJaWYgKGluZGV4RXZlbnRDb25zdW1lciA9PSBudWxsCisJCQkJfHwgIWlzSW5kZXhPckJpdG1hcEV4dFBvcyhyZWYua2V5LnBhY2tFeHRQb3MpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJRXZpY3RLZXkgZXZpY3RLZXkgPSBuZXcgRXZpY3RLZXkocmVmKTsKKwkJTG9uZyBwcmV2RXZpY3RlZFRpbWUgPSBpbmRleEV2aWN0aW9uTWFwLmdldChldmljdEtleSk7CisJCWxvbmcgbm93ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCWxvbmcgc2luY2VMYXN0RXZpY3Rpb25OYW5vcyA9IHByZXZFdmljdGVkVGltZSA9PSBudWxsID8gMEwKKwkJCQk6IG5vdyAtIHByZXZFdmljdGVkVGltZS5sb25nVmFsdWUoKTsKKwkJaW5kZXhFdmVudENvbnN1bWVyLmFjY2VwdFJlcXVlc3RlZEV2ZW50KHJlZi5rZXkucGFja0V4dFBvcywgY2FjaGVIaXQsCisJCQkJKG5vdyAtIHN0YXJ0KSAvIDEwMDBMIC8qIG1pY3JvcyAqLywgcmVmLnNpemUsCisJCQkJRHVyYXRpb24ub2ZOYW5vcyhzaW5jZUxhc3RFdmljdGlvbk5hbm9zKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlcG9ydEluZGV4RXZpY3RlZChSZWY8Pz4gZGVhZCkgeworCQlpZiAoaW5kZXhFdmVudENvbnN1bWVyID09IG51bGwKKwkJCQl8fCAhaW5kZXhFdmVudENvbnN1bWVyLnNob3VsZFJlcG9ydEV2aWN0ZWRFdmVudCgpCisJCQkJfHwgIWlzSW5kZXhPckJpdG1hcEV4dFBvcyhkZWFkLmtleS5wYWNrRXh0UG9zKSkgeworCQkJcmV0dXJuOworCQl9CisJCUV2aWN0S2V5IGV2aWN0S2V5ID0gbmV3IEV2aWN0S2V5KGRlYWQpOworCQlMb25nIHByZXZFdmljdGVkVGltZSA9IGluZGV4RXZpY3Rpb25NYXAuZ2V0KGV2aWN0S2V5KTsKKwkJbG9uZyBub3cgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKwkJbG9uZyBzaW5jZUxhc3RFdmljdGlvbk5hbm9zID0gcHJldkV2aWN0ZWRUaW1lID09IG51bGwgPyAwTAorCQkJCTogbm93IC0gcHJldkV2aWN0ZWRUaW1lLmxvbmdWYWx1ZSgpOworCQlpbmRleEV2aWN0aW9uTWFwLnB1dChldmljdEtleSwgTG9uZy52YWx1ZU9mKG5vdykpOworCQlpbmRleEV2ZW50Q29uc3VtZXIuYWNjZXB0RXZpY3RlZEV2ZW50KGRlYWQua2V5LnBhY2tFeHRQb3MsIGRlYWQuc2l6ZSwKKwkJCQlkZWFkLnRvdGFsSGl0Q291bnQuZ2V0KCksCisJCQkJRHVyYXRpb24ub2ZOYW5vcyhzaW5jZUxhc3RFdmljdGlvbk5hbm9zKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luZGV4T3JCaXRtYXBFeHRQb3MoaW50IHBhY2tFeHRQb3MpIHsKKwkJcmV0dXJuIHBhY2tFeHRQb3MgPT0gUGFja0V4dC5JTkRFWC5nZXRQb3NpdGlvbigpCisJCQkJfHwgcGFja0V4dFBvcyA9PSBQYWNrRXh0LkJJVE1BUF9JTkRFWC5nZXRQb3NpdGlvbigpOworCX0KKwogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEhhc2hFbnRyeSB7CiAJCS8qKiBOZXh0IGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlJ3MgY2hhaW4gbGlzdC4gKi8KIAkJZmluYWwgSGFzaEVudHJ5IG5leHQ7CkBAIC03MTIsNiArNzY4LDcgQEAgc3RhdGljIGZpbmFsIGNsYXNzIFJlZjxUPiB7CiAJCVJlZiBuZXh0OwogCiAJCXByaXZhdGUgdm9sYXRpbGUgaW50IGhvdENvdW50OworCQlwcml2YXRlIEF0b21pY0ludGVnZXIgdG90YWxIaXRDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CiAKIAkJUmVmKERmc1N0cmVhbUtleSBrZXksIGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSwgVCB2KSB7CiAJCQl0aGlzLmtleSA9IGtleTsKQEAgLTczNiw2ICs3OTMsNyBAQCB2b2lkIG1hcmtIb3R0ZXIoKSB7CiAJCQlpbnQgY2FwID0gRGZzQmxvY2tDYWNoZQogCQkJCQkuZ2V0SW5zdGFuY2UoKS5jYWNoZUhvdExpbWl0c1trZXkucGFja0V4dFBvc107CiAJCQlob3RDb3VudCA9IE1hdGgubWluKGNhcCwgaG90Q291bnQgKyAxKTsKKwkJCXRvdGFsSGl0Q291bnQuaW5jcmVtZW50QW5kR2V0KCk7CiAJCX0KIAogCQl2b2lkIG1hcmtDb2xkZXIoKSB7CkBAIC03NDcsNiArODA1LDM0IEBAIGJvb2xlYW4gaXNIb3QoKSB7CiAJCX0KIAl9CiAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmljdEtleSB7CisJCXByaXZhdGUgZmluYWwgaW50IGtleUhhc2g7CisJCXByaXZhdGUgZmluYWwgaW50IHBhY2tFeHRQb3M7CisJCXByaXZhdGUgZmluYWwgbG9uZyBwb3NpdGlvbjsKKworCQlFdmljdEtleShSZWY8Pz4gcmVmKSB7CisJCQlrZXlIYXNoID0gcmVmLmtleS5oYXNoOworCQkJcGFja0V4dFBvcyA9IHJlZi5rZXkucGFja0V4dFBvczsKKwkJCXBvc2l0aW9uID0gcmVmLnBvc2l0aW9uOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRXZpY3RLZXkpIHsKKwkJCQlFdmljdEtleSBvdGhlciA9IChFdmljdEtleSkgb2JqZWN0OworCQkJCXJldHVybiBrZXlIYXNoID09IG90aGVyLmtleUhhc2gKKwkJCQkJCSYmIHBhY2tFeHRQb3MgPT0gb3RoZXIucGFja0V4dFBvcworCQkJCQkJJiYgcG9zaXRpb24gPT0gb3RoZXIucG9zaXRpb247CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCXJldHVybiBEZnNCbG9ja0NhY2hlLmdldEluc3RhbmNlKCkuaGFzaChrZXlIYXNoLCBwb3NpdGlvbik7CisJCX0KKwl9CisKIAlARnVuY3Rpb25hbEludGVyZmFjZQogCWludGVyZmFjZSBSZWZMb2FkZXI8VD4gewogCQlSZWY8VD4gbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKQEAgLTc2Myw0ICs4NDksNCBAQCBpbnRlcmZhY2UgUmVhZGFibGVDaGFubmVsU3VwcGxpZXIgewogCQkgKi8KIAkJUmVhZGFibGVDaGFubmVsIGdldCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAl9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVDb25maWcuamF2YQppbmRleCAyNzE2Zjc5Li42OWEzNzA1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0Jsb2NrQ2FjaGVDb25maWcuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHMuQ09ORklHX0tFWV9TVFJFQU1fUkFUSU87CiAKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRpbWUuRHVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwpAQCAtNDYsOSArNDcsMTAgQEAgcHVibGljIGNsYXNzIERmc0Jsb2NrQ2FjaGVDb25maWcgewogCXByaXZhdGUgaW50IGNvbmN1cnJlbmN5TGV2ZWw7CiAKIAlwcml2YXRlIENvbnN1bWVyPExvbmc+IHJlZkxvY2s7Ci0KIAlwcml2YXRlIE1hcDxQYWNrRXh0LCBJbnRlZ2VyPiBjYWNoZUhvdE1hcDsKIAorCXByaXZhdGUgSW5kZXhFdmVudENvbnN1bWVyIGluZGV4RXZlbnRDb25zdW1lcjsKKwogCS8qKgogCSAqIENyZWF0ZSBhIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KIAkgKi8KQEAgLTIxNiw2ICsyMTgsMjggQEAgcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgc2V0Q2FjaGVIb3RNYXAoCiAJfQogCiAJLyoqCisJICogR2V0IHRoZSBjb25zdW1lciBvZiBjYWNoZSBpbmRleCBldmVudHMuCisJICoKKwkgKiBAcmV0dXJuIGNvbnN1bWVyIG9mIGNhY2hlIGluZGV4IGV2ZW50cy4KKwkgKi8KKwlwdWJsaWMgSW5kZXhFdmVudENvbnN1bWVyIGdldEluZGV4RXZlbnRDb25zdW1lcigpIHsKKwkJcmV0dXJuIGluZGV4RXZlbnRDb25zdW1lcjsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIGNvbnN1bWVyIG9mIGNhY2hlIGluZGV4IGV2ZW50cy4KKwkgKgorCSAqIEBwYXJhbSBpbmRleEV2ZW50Q29uc3VtZXIKKwkgKiAgICAgICAgICAgIGNvbnN1bWVyIG9mIGNhY2hlIGluZGV4IGV2ZW50cy4KKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorCSAqLworCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIHNldEluZGV4RXZlbnRDb25zdW1lcigKKwkJCUluZGV4RXZlbnRDb25zdW1lciBpbmRleEV2ZW50Q29uc3VtZXIpIHsKKwkJdGhpcy5pbmRleEV2ZW50Q29uc3VtZXIgPSBpbmRleEV2ZW50Q29uc3VtZXI7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgogCSAqIFVwZGF0ZSBwcm9wZXJ0aWVzIGJ5IHNldHRpbmcgZmllbGRzIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uCiAJICogPHA+CiAJICogSWYgYSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiwgdGhlbiBpdCBpcyBsZWZ0CkBAIC0yNzIsNCArMjk2LDUyIEBAIHB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIGZyb21Db25maWcoQ29uZmlnIHJjKSB7CiAJCX0KIAkJcmV0dXJuIHRoaXM7CiAJfQotfQorCisJLyoqIENvbnN1bWVyIG9mIERmc0Jsb2NrQ2FjaGUgbG9hZGluZyBhbmQgZXZpY3Rpb24gZXZlbnRzIGZvciBpbmRleGVzLiAqLworCXB1YmxpYyBpbnRlcmZhY2UgSW5kZXhFdmVudENvbnN1bWVyIHsKKwkJLyoqCisJCSAqIEFjY2VwdCBhbiBldmVudCBvZiBhbiBpbmRleCByZXF1ZXN0ZWQuIEl0IGNvdWxkIGJlIGxvYWRlZCBmcm9tIGVpdGhlcgorCQkgKiBjYWNoZSBvciBzdG9yYWdlLgorCQkgKgorCQkgKiBAcGFyYW0gcGFja0V4dFBvcworCQkgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHtAY29kZSBQYWNrRXh0fSBlbnVtCisJCSAqIEBwYXJhbSBjYWNoZUhpdAorCQkgKiAgICAgICAgICAgIHRydWUgaWYgYW4gaW5kZXggd2FzIGFscmVhZHkgaW4gY2FjaGUuIE90aGVyd2lzZSwgdGhlCisJCSAqICAgICAgICAgICAgaW5kZXggd2FzIGxvYWRlZCBmcm9tIHN0b3JhZ2UgaW50byB0aGUgY2FjaGUgaW4gdGhlCisJCSAqICAgICAgICAgICAgY3VycmVudCByZXF1ZXN0LAorCQkgKiBAcGFyYW0gbG9hZE1pY3JvcworCQkgKiAgICAgICAgICAgIHRpbWUgdG8gbG9hZCBhbiBpbmRleCBmcm9tIGNhY2hlIG9yIHN0b3JhZ2UgaW4KKwkJICogICAgICAgICAgICBtaWNyb3NlY29uZHMKKwkJICogQHBhcmFtIGJ5dGVzCisJCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGxvYWRlZAorCQkgKiBAcGFyYW0gbGFzdEV2aWN0aW9uRHVyYXRpb24KKwkJICogICAgICAgICAgICB0aW1lIHNpbmNlIGxhc3QgZXZpY3Rpb24sIDAgaWYgd2FzIG5vdCBldmljdGVkIHlldAorCQkgKi8KKwkJdm9pZCBhY2NlcHRSZXF1ZXN0ZWRFdmVudChpbnQgcGFja0V4dFBvcywgYm9vbGVhbiBjYWNoZUhpdCwKKwkJCQlsb25nIGxvYWRNaWNyb3MsIGxvbmcgYnl0ZXMsIER1cmF0aW9uIGxhc3RFdmljdGlvbkR1cmF0aW9uKTsKKworCQkvKioKKwkJICogQWNjZXB0IGFuIGV2ZW50IG9mIGFuIGluZGV4IGV2aWN0ZWQgZnJvbSBjYWNoZS4KKwkJICoKKwkJICogQHBhcmFtIHBhY2tFeHRQb3MKKwkJICogICAgICAgICAgICBwb3NpdGlvbiBpbiB7QGNvZGUgUGFja0V4dH0gZW51bQorCQkgKiBAcGFyYW0gYnl0ZXMKKwkJICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgZXZpY3RlZAorCQkgKiBAcGFyYW0gdG90YWxDYWNoZUhpdENvdW50CisJCSAqICAgICAgICAgICAgbnVtYmVyIG9mIHRpbWVzIGFuIGluZGV4IHdhcyBhY2Nlc3NlZCB3aGlsZSBpbiBjYWNoZQorCQkgKiBAcGFyYW0gbGFzdEV2aWN0aW9uRHVyYXRpb24KKwkJICogICAgICAgICAgICB0aW1lIHNpbmNlIGxhc3QgZXZpY3Rpb24sIDAgaWYgd2FzIG5vdCBldmljdGVkIHlldAorCQkgKi8KKwkJZGVmYXVsdCB2b2lkIGFjY2VwdEV2aWN0ZWRFdmVudChpbnQgcGFja0V4dFBvcywgbG9uZyBieXRlcywKKwkJCQlpbnQgdG90YWxDYWNoZUhpdENvdW50LCBEdXJhdGlvbiBsYXN0RXZpY3Rpb25EdXJhdGlvbikgeworCQkJLy8gT2ZmIGJ5IGRlZmF1bHQuCisJCX0KKworCQkvKioKKwkJICogQHJldHVybiB0cnVlIGlmIHJlcG9ydGluZyBldmljdGVkIGV2ZW50cyBpcyBlbmFibGVkLgorCQkgKi8KKwkJZGVmYXVsdCBib29sZWFuIHNob3VsZFJlcG9ydEV2aWN0ZWRFdmVudCgpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tGaWxlLmphdmEKaW5kZXggYmI3NmRmMS4uZjdhMmM5NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0ZpbGUuamF2YQpAQCAtMTA2MSw3ICsxMDYxLDggQEAgcHJpdmF0ZSBEZnNCbG9ja0NhY2hlLlJlZjxQYWNrQml0bWFwSW5kZXg+IGxvYWRCaXRtYXBJbmRleChEZnNSZWFkZXIgY3R4LAogCQkJCX0KIAkJCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGluLCBicyk7CiAJCQkJYm1pZHggPSBQYWNrQml0bWFwSW5kZXgucmVhZChpbiwgKCkgLT4gaWR4KGN0eCksCi0JCQkJCQkoKSAtPiBnZXRSZXZlcnNlSWR4KGN0eCkpOworCQkJCQkJKCkgLT4gZ2V0UmV2ZXJzZUlkeChjdHgpLAorCQkJCQkJY3R4LmdldE9wdGlvbnMoKS5zaG91bGRMb2FkUmV2SW5kZXhJblBhcmFsbGVsKCkpOwogCQkJfSBmaW5hbGx5IHsKIAkJCQlzaXplID0gcmMucG9zaXRpb24oKTsKIAkJCQljdHguc3RhdHMucmVhZEJpdG1hcElkeEJ5dGVzICs9IHNpemU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlYWRlck9wdGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUmVhZGVyT3B0aW9ucy5qYXZhCmluZGV4IDg5ZGU1MzQuLjE0NmY3NjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUmVhZGVyT3B0aW9ucy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUmVhZGVyT3B0aW9ucy5qYXZhCkBAIC0zNCw2ICszNCw4IEBAIHB1YmxpYyBjbGFzcyBEZnNSZWFkZXJPcHRpb25zIHsKIAogCXByaXZhdGUgaW50IHN0cmVhbVBhY2tCdWZmZXJTaXplOwogCisJcHJpdmF0ZSBib29sZWFuIGxvYWRSZXZJbmRleEluUGFyYWxsZWw7CisKIAkvKioKIAkgKiBDcmVhdGUgYSBkZWZhdWx0IHJlYWRlciBjb25maWd1cmF0aW9uLgogCSAqLwpAQCAtMTEzLDYgKzExNSwyOCBAQCBwdWJsaWMgRGZzUmVhZGVyT3B0aW9ucyBzZXRTdHJlYW1QYWNrQnVmZmVyU2l6ZShpbnQgYnVmc3opIHsKIAl9CiAKIAkvKioKKwkgKiBDaGVjayBpZiByZXZlcnNlIGluZGV4IHNob3VsZCBiZSBsb2FkZWQgaW4gcGFyYWxsZWwuCisJICoKKwkgKiBAcmV0dXJuIHRydWUgaWYgcmV2ZXJzZSBpbmRleCBpcyBsb2FkZWQgaW4gcGFyYWxsZWwgZm9yIGJpdG1hcCBpbmRleC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzaG91bGRMb2FkUmV2SW5kZXhJblBhcmFsbGVsKCkgeworCQlyZXR1cm4gbG9hZFJldkluZGV4SW5QYXJhbGxlbDsKKwl9CisKKwkvKioKKwkgKiBFbmFibGUgKG9yIGRpc2FibGUpIHBhcmFsbGVsIGxvYWRpbmcgb2YgcmV2ZXJzZSBpbmRleC4KKwkgKgorCSAqIEBwYXJhbSBsb2FkUmV2SW5kZXhJblBhcmFsbGVsCisJICogICAgICAgICAgICB3aGV0aGVyIHRvIGxvYWQgcmV2ZXJzZSBpbmRleCBpbiBwYXJhbGxlbC4KKwkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorCSAqLworCXB1YmxpYyBEZnNSZWFkZXJPcHRpb25zIHNldExvYWRSZXZJbmRleEluUGFyYWxsZWwoCisJCQlib29sZWFuIGxvYWRSZXZJbmRleEluUGFyYWxsZWwpIHsKKwkJdGhpcy5sb2FkUmV2SW5kZXhJblBhcmFsbGVsID0gbG9hZFJldkluZGV4SW5QYXJhbGxlbDsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCiAJICogVXBkYXRlIHByb3BlcnRpZXMgYnkgc2V0dGluZyBmaWVsZHMgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4KIAkgKiA8cD4KIAkgKiBJZiBhIHByb3BlcnR5IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uLCB0aGVuIGl0IGlzIGxlZnQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvSW5NZW1vcnlSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0luTWVtb3J5UmVwb3NpdG9yeS5qYXZhCmluZGV4IDViNjg5NGQuLjk5ZGEyMjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvSW5NZW1vcnlSZXBvc2l0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9Jbk1lbW9yeVJlcG9zaXRvcnkuamF2YQpAQCAtMTY1LDYgKzE2NSwxNSBAQCBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKIAkJCQl9CiAJCQl9OwogCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBsb25nIGdldEFwcHJveGltYXRlT2JqZWN0Q291bnQoKSB7CisJCQlsb25nIGNvdW50ID0gMDsKKwkJCWZvciAoRGZzUGFja0Rlc2NyaXB0aW9uIHAgOiBwYWNrcykgeworCQkJCWNvdW50ICs9IHAuZ2V0T2JqZWN0Q291bnQoKTsKKwkJCX0KKwkJCXJldHVybiBjb3VudDsKKwkJfQogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIE1lbVBhY2sgZXh0ZW5kcyBEZnNQYWNrRGVzY3JpcHRpb24gewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9MYXJnZVBhY2tlZFdob2xlT2JqZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0xhcmdlUGFja2VkV2hvbGVPYmplY3QuamF2YQppbmRleCBiMDYxMmY5Li5jZDRmMTY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0xhcmdlUGFja2VkV2hvbGVPYmplY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0xhcmdlUGFja2VkV2hvbGVPYmplY3QuamF2YQpAQCAtNzMsNyArNzMsNiBAQCBwdWJsaWMgYm9vbGVhbiBpc0xhcmdlKCkgewogCXB1YmxpYyBPYmplY3RTdHJlYW0gb3BlblN0cmVhbSgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCVBhY2tJbnB1dFN0cmVhbSBwYWNrSW47CiAJCS8vIGN0eCBpcyBjbG9zZWQgYnkgUGFja0lucHV0U3RyZWFtLCBvciBleHBsaWNpdGx5IGluIHRoZSBmaW5hbGx5IGJsb2NrCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJCURmc1JlYWRlciBjdHggPSBkYi5uZXdSZWFkZXIoKTsKIAkJdHJ5IHsKIAkJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9DYWNoZWRPYmplY3REaXJlY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhCmluZGV4IDdkZWRlYjUuLjA5NGZkYzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhCkBAIC0yNjMsNCArMjYzLDE3IEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIFVucGFja2VkT2JqZWN0SWQgZXh0ZW5kcyBPYmplY3RJZE93bmVyTWFwLkVudHJ5IHsKIAlwcml2YXRlIEFsdGVybmF0ZUhhbmRsZS5JZCBnZXRBbHRlcm5hdGVJZCgpIHsKIAkJcmV0dXJuIHdyYXBwZWQuZ2V0QWx0ZXJuYXRlSWQoKTsKIAl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgbG9uZyBnZXRBcHByb3hpbWF0ZU9iamVjdENvdW50KCkgeworCQlsb25nIGNvdW50ID0gMDsKKwkJZm9yIChQYWNrIHAgOiBnZXRQYWNrcygpKSB7CisJCQl0cnkgeworCQkJCWNvdW50ICs9IHAuZ2V0T2JqZWN0Q291bnQoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIGNvdW50OworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZWZ0YWJsZVN0YWNrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVmdGFibGVTdGFjay5qYXZhCmluZGV4IGYwMmM4NjEuLjUxNTIzNjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZWZ0YWJsZVN0YWNrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlZnRhYmxlU3RhY2suamF2YQpAQCAtNDAsNiArNDAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZVdyaXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3lzdGVtUmVhZGVyOwogCiAvKioKICAqIEEgbXV0YWJsZSBzdGFjayBvZiByZWZ0YWJsZXMgb24gbG9jYWwgZmlsZXN5c3RlbSBzdG9yYWdlLiBOb3QgdGhyZWFkLXNhZmUuCkBAIC01MjcsMTEgKzUyOCwxOSBAQCBib29sZWFuIGNvbXBhY3RSYW5nZShpbnQgZmlyc3QsIGludCBsYXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJcmVsb2FkKCk7CiAJCQlmb3IgKEZpbGUgZiA6IGRlbGV0ZU9uU3VjY2VzcykgewotCQkJCUZpbGVzLmRlbGV0ZShmLnRvUGF0aCgpKTsKKwkJCQl0cnkgeworCQkJCQlGaWxlcy5kZWxldGUoZi50b1BhdGgoKSk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBJZ25vcmU6IHRoaXMgY2FuIGhhcHBlbiBvbiBXaW5kb3dzIGluIGNhc2Ugb2YgY29uY3VycmVudCBwcm9jZXNzZXMuCisJCQkJCS8vIGxlYXZlIHRoZSBnYXJiYWdlIGFuZCBjb250aW51ZS4KKwkJCQkJaWYgKCFTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5pc1dpbmRvd3MoKSkgeworCQkJCQkJdGhyb3cgZTsKKwkJCQkJfQorCQkJCX0KIAkJCX0KIAotCQkJcmVsb2FkKCk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfSBmaW5hbGx5IHsKIAkJCWlmICh0bXBUYWJsZSAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlcG9zaXRvcnkuamF2YQppbmRleCBiMzcxNTU3Li4zZTkyY2RkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEKQEAgLTY3MiwxOCArNjcyLDIwIEBAIHZvaWQgY29udmVydFRvUGFja2VkUmVmcyhib29sZWFuIHdyaXRlTG9ncywgYm9vbGVhbiBiYWNrdXApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkJCWlmICh3cml0ZUxvZ3MpIHsKIAkJCQlMaXN0PFJlZmxvZ0VudHJ5PiBsb2dzID0gb2xkRGIuZ2V0UmVmbG9nUmVhZGVyKHIuZ2V0TmFtZSgpKQotCQkJCQkuZ2V0UmV2ZXJzZUVudHJpZXMoKTsKKwkJCQkJCS5nZXRSZXZlcnNlRW50cmllcygpOwogCQkJCUNvbGxlY3Rpb25zLnJldmVyc2UobG9ncyk7CiAJCQkJZm9yIChSZWZsb2dFbnRyeSBlIDogbG9ncykgewogCQkJCQlsb2dXcml0ZXIubG9nKHIuZ2V0TmFtZSgpLCBlKTsKIAkJCQl9Ci0JCX0KKwkJCX0KIAkJfQogCiAJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHRoaXMpKSB7CiAJCQlicnUuZXhlY3V0ZShydywgTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSk7CiAJCX0KIAorCQlvbGREYi5jbG9zZSgpOworCiAJCUxpc3Q8U3RyaW5nPiBmYWlsZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBicnUuZ2V0Q29tbWFuZHMoKSkgewogCQkJaWYgKGNtZC5nZXRSZXN1bHQoKSAhPSBSZWNlaXZlQ29tbWFuZC5SZXN1bHQuT0spIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvb3NlT2JqZWN0cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9vc2VPYmplY3RzLmphdmEKaW5kZXggMzM2MjFhMS4uYjlhZjgzZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9vc2VPYmplY3RzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9vc2VPYmplY3RzLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLk5vU3VjaEZpbGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZENvcHlPcHRpb247CkBAIC0yNCw2ICsyNSw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGUuRmlsZU9iamVjdERhdGFiYXNlLkluc2VydExvb3NlT2JqZWN0UmVzdWx0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFiYnJldmlhdGVkT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0TG9hZGVyOwpAQCAtNTIsMTUgKzU1LDIyIEBAIGNsYXNzIExvb3NlT2JqZWN0cyB7CiAKIAlwcml2YXRlIGZpbmFsIFVucGFja2VkT2JqZWN0Q2FjaGUgdW5wYWNrZWRPYmplY3RDYWNoZTsKIAorCXByaXZhdGUgZmluYWwgYm9vbGVhbiB0cnVzdEZvbGRlclN0YXQ7CisKIAkvKioKIAkgKiBJbml0aWFsaXplIGEgcmVmZXJlbmNlIHRvIGFuIG9uLWRpc2sgb2JqZWN0IGRpcmVjdG9yeS4KIAkgKgorCSAqIEBwYXJhbSBjb25maWcKKwkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBsb29zZSBvYmplY3RzIGhhbmRsZXIuCiAJICogQHBhcmFtIGRpcgogCSAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSA8Y29kZT5vYmplY3RzPC9jb2RlPiBkaXJlY3RvcnkuCiAJICovCi0JTG9vc2VPYmplY3RzKEZpbGUgZGlyKSB7CisJTG9vc2VPYmplY3RzKENvbmZpZyBjb25maWcsIEZpbGUgZGlyKSB7CiAJCWRpcmVjdG9yeSA9IGRpcjsKIAkJdW5wYWNrZWRPYmplY3RDYWNoZSA9IG5ldyBVbnBhY2tlZE9iamVjdENhY2hlKCk7CisJCXRydXN0Rm9sZGVyU3RhdCA9IGNvbmZpZy5nZXRCb29sZWFuKAorCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLAorCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1RSVVNURk9MREVSU1RBVCwgdHJ1ZSk7CiAJfQogCiAJLyoqCkBAIC05OCw2ICsxMDgsMTkgQEAgYm9vbGVhbiBoYXNDYWNoZWQoQW55T2JqZWN0SWQgaWQpIHsKIAkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBzdG9yZWQgYXMgYSBsb29zZSBvYmplY3QuCiAJICovCiAJYm9vbGVhbiBoYXMoQW55T2JqZWN0SWQgb2JqZWN0SWQpIHsKKwkJYm9vbGVhbiBleGlzdHMgPSBoYXNXaXRob3V0UmVmcmVzaChvYmplY3RJZCk7CisJCWlmICh0cnVzdEZvbGRlclN0YXQgfHwgZXhpc3RzKSB7CisJCQlyZXR1cm4gZXhpc3RzOworCQl9CisJCXRyeSAoSW5wdXRTdHJlYW0gc3RyZWFtID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oZGlyZWN0b3J5LnRvUGF0aCgpKSkgeworCQkJLy8gcmVmcmVzaCBkaXJlY3RvcnkgdG8gd29yayBhcm91bmQgTkZTIGNhY2hpbmcgaXNzdWUKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiBoYXNXaXRob3V0UmVmcmVzaChvYmplY3RJZCk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGhhc1dpdGhvdXRSZWZyZXNoKEFueU9iamVjdElkIG9iamVjdElkKSB7CiAJCXJldHVybiBmaWxlRm9yKG9iamVjdElkKS5leGlzdHMoKTsKIAl9CiAKQEAgLTE4Myw2ICsyMDYsMjIgQEAgT2JqZWN0TG9hZGVyIG9wZW4oV2luZG93Q3Vyc29yIGN1cnMsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqLwogCU9iamVjdExvYWRlciBnZXRPYmplY3RMb2FkZXIoV2luZG93Q3Vyc29yIGN1cnMsIEZpbGUgcGF0aCwgQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIGdldE9iamVjdExvYWRlcldpdGhvdXRSZWZyZXNoKGN1cnMsIHBhdGgsIGlkKTsKKwkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCWlmICh0cnVzdEZvbGRlclN0YXQpIHsKKwkJCQl0aHJvdyBlOworCQkJfQorCQkJdHJ5IChJbnB1dFN0cmVhbSBzdHJlYW0gPSBGaWxlcworCQkJCQkubmV3SW5wdXRTdHJlYW0oZGlyZWN0b3J5LnRvUGF0aCgpKSkgeworCQkJCS8vIHJlZnJlc2ggZGlyZWN0b3J5IHRvIHdvcmsgYXJvdW5kIE5GUyBjYWNoaW5nIGlzc3VlcworCQkJfQorCQkJcmV0dXJuIGdldE9iamVjdExvYWRlcldpdGhvdXRSZWZyZXNoKGN1cnMsIHBhdGgsIGlkKTsKKwkJfQorCX0KKworCXByaXZhdGUgT2JqZWN0TG9hZGVyIGdldE9iamVjdExvYWRlcldpdGhvdXRSZWZyZXNoKFdpbmRvd0N1cnNvciBjdXJzLAorCQkJRmlsZSBwYXRoLCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgpKSB7CiAJCQl1bnBhY2tlZE9iamVjdENhY2hlKCkuYWRkKGlkKTsKIAkJCXJldHVybiBVbnBhY2tlZE9iamVjdC5vcGVuKGluLCBwYXRoLCBpZCwgY3Vycyk7CkBAIC0yMDMsMTYgKzI0MiwzNCBAQCBVbnBhY2tlZE9iamVjdENhY2hlIHVucGFja2VkT2JqZWN0Q2FjaGUoKSB7CiAJfQogCiAJbG9uZyBnZXRTaXplKFdpbmRvd0N1cnNvciBjdXJzLCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBnZXRTaXplV2l0aG91dFJlZnJlc2goY3VycywgaWQpOworCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gbm9GaWxlKSB7CisJCQl0cnkgeworCQkJCWlmICh0cnVzdEZvbGRlclN0YXQpIHsKKwkJCQkJdGhyb3cgbm9GaWxlOworCQkJCX0KKwkJCQl0cnkgKElucHV0U3RyZWFtIHN0cmVhbSA9IEZpbGVzCisJCQkJCQkubmV3SW5wdXRTdHJlYW0oZGlyZWN0b3J5LnRvUGF0aCgpKSkgeworCQkJCQkvLyByZWZyZXNoIGRpcmVjdG9yeSB0byB3b3JrIGFyb3VuZCBORlMgY2FjaGluZyBpc3N1ZQorCQkJCX0KKwkJCQlyZXR1cm4gZ2V0U2l6ZVdpdGhvdXRSZWZyZXNoKGN1cnMsIGlkKTsKKwkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKGZpbGVGb3IoaWQpLmV4aXN0cygpKSB7CisJCQkJCXRocm93IG5vRmlsZTsKKwkJCQl9CisJCQkJdW5wYWNrZWRPYmplY3RDYWNoZSgpLnJlbW92ZShpZCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBsb25nIGdldFNpemVXaXRob3V0UmVmcmVzaChXaW5kb3dDdXJzb3IgY3VycywgQW55T2JqZWN0SWQgaWQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIGYgPSBmaWxlRm9yKGlkKTsKIAkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpKSB7CiAJCQl1bnBhY2tlZE9iamVjdENhY2hlKCkuYWRkKGlkKTsKIAkJCXJldHVybiBVbnBhY2tlZE9iamVjdC5nZXRTaXplKGluLCBpZCwgY3Vycyk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBub0ZpbGUpIHsKLQkJCWlmIChmLmV4aXN0cygpKSB7Ci0JCQkJdGhyb3cgbm9GaWxlOwotCQkJfQotCQkJdW5wYWNrZWRPYmplY3RDYWNoZSgpLnJlbW92ZShpZCk7Ci0JCQlyZXR1cm4gLTE7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEKaW5kZXggYTNjZTMxNS4uYWMzYTU1MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEKQEAgLTEyMSw3ICsxMjEsNyBAQCBwdWJsaWMgT2JqZWN0RGlyZWN0b3J5KGZpbmFsIENvbmZpZyBjZmcsIGZpbmFsIEZpbGUgZGlyLAogCQlGaWxlIHBhY2tEaXJlY3RvcnkgPSBuZXcgRmlsZShvYmplY3RzLCAicGFjayIpOyAvLyROT04tTkxTLTEkCiAJCUZpbGUgcHJlc2VydmVkRGlyZWN0b3J5ID0gbmV3IEZpbGUocGFja0RpcmVjdG9yeSwgInByZXNlcnZlZCIpOyAvLyROT04tTkxTLTEkCiAJCWFsdGVybmF0ZXNGaWxlID0gbmV3IEZpbGUob2JqZWN0cywgQ29uc3RhbnRzLklORk9fQUxURVJOQVRFUyk7Ci0JCWxvb3NlID0gbmV3IExvb3NlT2JqZWN0cyhvYmplY3RzKTsKKwkJbG9vc2UgPSBuZXcgTG9vc2VPYmplY3RzKGNvbmZpZywgb2JqZWN0cyk7CiAJCXBhY2tlZCA9IG5ldyBQYWNrRGlyZWN0b3J5KGNvbmZpZywgcGFja0RpcmVjdG9yeSk7CiAJCXByZXNlcnZlZCA9IG5ldyBQYWNrRGlyZWN0b3J5KGNvbmZpZywgcHJlc2VydmVkRGlyZWN0b3J5KTsKIAkJdGhpcy5mcyA9IGZzOwpAQCAtMjEzLDYgKzIxMywyMCBAQCBwdWJsaWMgQ29sbGVjdGlvbjxQYWNrPiBnZXRQYWNrcygpIHsKIAkJcmV0dXJuIHBhY2tlZC5nZXRQYWNrcygpOwogCX0KIAorCS8qKiB7QGluaGVyaXREb2N9ICovCisJQE92ZXJyaWRlCisJcHVibGljIGxvbmcgZ2V0QXBwcm94aW1hdGVPYmplY3RDb3VudCgpIHsKKwkJbG9uZyBjb3VudCA9IDA7CisJCWZvciAoUGFjayBwIDogZ2V0UGFja3MoKSkgeworCQkJdHJ5IHsKKwkJCQljb3VudCArPSBwLmdldEluZGV4KCkuZ2V0T2JqZWN0Q291bnQoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJcmV0dXJuIGNvdW50OworCX0KKwogCS8qKgogCSAqIHtAaW5oZXJpdERvY30KIAkgKiA8cD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tCaXRtYXBJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4LmphdmEKaW5kZXggODQwMWYwNy4uOGZiMTdmYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4LmphdmEKQEAgLTk1LDcgKzk1LDcgQEAgcHVibGljIHN0YXRpYyBQYWNrQml0bWFwSW5kZXggb3BlbihGaWxlIGlkeEZpbGUsIFBhY2tJbmRleCBwYWNrSW5kZXgsCiAJICovCiAJcHVibGljIHN0YXRpYyBQYWNrQml0bWFwSW5kZXggcmVhZChJbnB1dFN0cmVhbSBmZCwgUGFja0luZGV4IHBhY2tJbmRleCwKIAkJCVBhY2tSZXZlcnNlSW5kZXggcmV2ZXJzZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFBhY2tCaXRtYXBJbmRleFYxKGZkLCAoKSAtPiBwYWNrSW5kZXgsICgpIC0+IHJldmVyc2VJbmRleCk7CisJCXJldHVybiBuZXcgUGFja0JpdG1hcEluZGV4VjEoZmQsIHBhY2tJbmRleCwgcmV2ZXJzZUluZGV4KTsKIAl9CiAKIAkvKioKQEAgLTExNCw2ICsxMTQsOCBAQCBwdWJsaWMgc3RhdGljIFBhY2tCaXRtYXBJbmRleCByZWFkKElucHV0U3RyZWFtIGZkLCBQYWNrSW5kZXggcGFja0luZGV4LAogCSAqIEBwYXJhbSByZXZlcnNlSW5kZXhTdXBwbGllcgogCSAqICAgICAgICAgICAgdGhlIHN1cHBsaWVyIGZvciBwYWNrIHJldmVyc2UgaW5kZXggZm9yIHRoZSBjb3JyZXNwb25kaW5nIHBhY2sKIAkgKiAgICAgICAgICAgIGZpbGUuCisJICogQHBhcmFtIGxvYWRQYXJhbGxlbFJldkluZGV4CisJICogICAgICAgICAgICB3aGV0aGVyIHJldmVyc2UgaW5kZXggc2hvdWxkIGJlIGxvYWRlZCBpbiBwYXJhbGxlbAogCSAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBpbmRleCBpbi1tZW1vcnkuCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSBjYW5ub3QgYmUgcmVhZC4KQEAgLTEyMiwxMCArMTI0LDExIEBAIHB1YmxpYyBzdGF0aWMgUGFja0JpdG1hcEluZGV4IHJlYWQoSW5wdXRTdHJlYW0gZmQsIFBhY2tJbmRleCBwYWNrSW5kZXgsCiAJICovCiAJcHVibGljIHN0YXRpYyBQYWNrQml0bWFwSW5kZXggcmVhZChJbnB1dFN0cmVhbSBmZCwKIAkJCVN1cHBsaWVyV2l0aElPRXhjZXB0aW9uPFBhY2tJbmRleD4gcGFja0luZGV4U3VwcGxpZXIsCi0JCQlTdXBwbGllcldpdGhJT0V4Y2VwdGlvbjxQYWNrUmV2ZXJzZUluZGV4PiByZXZlcnNlSW5kZXhTdXBwbGllcikKKwkJCVN1cHBsaWVyV2l0aElPRXhjZXB0aW9uPFBhY2tSZXZlcnNlSW5kZXg+IHJldmVyc2VJbmRleFN1cHBsaWVyLAorCQkJYm9vbGVhbiBsb2FkUGFyYWxsZWxSZXZJbmRleCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBuZXcgUGFja0JpdG1hcEluZGV4VjEoZmQsIHBhY2tJbmRleFN1cHBsaWVyLAotCQkJCXJldmVyc2VJbmRleFN1cHBsaWVyKTsKKwkJCQlyZXZlcnNlSW5kZXhTdXBwbGllciwgbG9hZFBhcmFsbGVsUmV2SW5kZXgpOwogCX0KIAogCS8qKiBGb290ZXIgY2hlY2tzdW0gYXBwbGllZCBvbiB0aGUgYm90dG9tIG9mIHRoZSBwYWNrIGZpbGUuICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXhWMS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4VjEuamF2YQppbmRleCA2ODQ2ZTNiLi4yMWFiYTNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXhWMS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tCaXRtYXBJbmRleFYxLmphdmEKQEAgLTE3LDYgKzE3LDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwpAQCAtNDAsNiArNDYsMjMgQEAgY2xhc3MgUGFja0JpdG1hcEluZGV4VjEgZXh0ZW5kcyBCYXNlUGFja0JpdG1hcEluZGV4IHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfWE9SX09GRlNFVCA9IDEyNjsKIAorCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycworCQkJLm5ld0NhY2hlZFRocmVhZFBvb2wobmV3IFRocmVhZEZhY3RvcnkoKSB7CisJCQkJcHJpdmF0ZSBmaW5hbCBUaHJlYWRGYWN0b3J5IGJhc2VGYWN0b3J5ID0gRXhlY3V0b3JzCisJCQkJCQkuZGVmYXVsdFRocmVhZEZhY3RvcnkoKTsKKworCQkJCXByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciB0aHJlYWROdW1iZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisJCQkJCVRocmVhZCB0aHJlYWQgPSBiYXNlRmFjdG9yeS5uZXdUaHJlYWQocnVubmFibGUpOworCQkJCQl0aHJlYWQuc2V0TmFtZSgiSkdpdC1QYWNrQml0bWFwSW5kZXhWMS0iIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkrIHRocmVhZE51bWJlci5nZXRBbmRJbmNyZW1lbnQoKSk7CisJCQkJCXRocmVhZC5zZXREYWVtb24odHJ1ZSk7CisJCQkJCXJldHVybiB0aHJlYWQ7CisJCQkJfQorCQkJfSk7CisKIAlwcml2YXRlIGZpbmFsIFBhY2tJbmRleCBwYWNrSW5kZXg7CiAJcHJpdmF0ZSBmaW5hbCBQYWNrUmV2ZXJzZUluZGV4IHJldmVyc2VJbmRleDsKIAlwcml2YXRlIGZpbmFsIEVXQUhDb21wcmVzc2VkQml0bWFwIGNvbW1pdHM7CkBAIC00OSwxNSArNzIsMjggQEAgY2xhc3MgUGFja0JpdG1hcEluZGV4VjEgZXh0ZW5kcyBCYXNlUGFja0JpdG1hcEluZGV4IHsKIAogCXByaXZhdGUgZmluYWwgT2JqZWN0SWRPd25lck1hcDxTdG9yZWRCaXRtYXA+IGJpdG1hcHM7CiAKKwlQYWNrQml0bWFwSW5kZXhWMShmaW5hbCBJbnB1dFN0cmVhbSBmZCwgUGFja0luZGV4IHBhY2tJbmRleCwKKwkJCVBhY2tSZXZlcnNlSW5kZXggcmV2ZXJzZUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0aGlzKGZkLCAoKSAtPiBwYWNrSW5kZXgsICgpIC0+IHJldmVyc2VJbmRleCwgZmFsc2UpOworCX0KKwogCVBhY2tCaXRtYXBJbmRleFYxKGZpbmFsIElucHV0U3RyZWFtIGZkLAogCQkJU3VwcGxpZXJXaXRoSU9FeGNlcHRpb248UGFja0luZGV4PiBwYWNrSW5kZXhTdXBwbGllciwKLQkJCVN1cHBsaWVyV2l0aElPRXhjZXB0aW9uPFBhY2tSZXZlcnNlSW5kZXg+IHJldmVyc2VJbmRleFN1cHBsaWVyKQorCQkJU3VwcGxpZXJXaXRoSU9FeGNlcHRpb248UGFja1JldmVyc2VJbmRleD4gcmV2ZXJzZUluZGV4U3VwcGxpZXIsCisJCQlib29sZWFuIGxvYWRQYXJhbGxlbFJldkluZGV4KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJLy8gQW4gZW50cnkgaXMgb2JqZWN0IGlkLCB4b3Igb2Zmc2V0LCBmbGFnIGJ5dGUsIGFuZCBhIGxlbmd0aCBlbmNvZGVkCiAJCS8vIGJpdG1hcC4gVGhlIG9iamVjdCBpZCBpcyBhbiBpbnQzMiBvZiB0aGUgbnRoIHBvc2l0aW9uIHNvcnRlZCBieSBuYW1lLgogCQlzdXBlcihuZXcgT2JqZWN0SWRPd25lck1hcDxTdG9yZWRCaXRtYXA+KCkpOwogCQl0aGlzLmJpdG1hcHMgPSBnZXRCaXRtYXBzKCk7CiAKKwkJLy8gT3B0aW9uYWxseSBzdGFydCBsb2FkaW5nIHJldmVyc2UgaW5kZXggaW4gcGFyYWxsZWwgdG8gbG9hZGluZyBiaXRtYXAKKwkJLy8gZnJvbSBzdG9yYWdlLgorCQlGdXR1cmU8UGFja1JldmVyc2VJbmRleD4gcmV2ZXJzZUluZGV4RnV0dXJlID0gbnVsbDsKKwkJaWYgKGxvYWRQYXJhbGxlbFJldkluZGV4KSB7CisJCQlyZXZlcnNlSW5kZXhGdXR1cmUgPSBleGVjdXRvci5zdWJtaXQocmV2ZXJzZUluZGV4U3VwcGxpZXI6OmdldCk7CisJCX0KKwogCQlmaW5hbCBieXRlW10gc2NyYXRjaCA9IG5ldyBieXRlWzMyXTsKIAkJSU8ucmVhZEZ1bGx5KGZkLCBzY3JhdGNoLCAwLCBzY3JhdGNoLmxlbmd0aCk7CiAKQEAgLTE2NCw3ICsyMDAsMTggQEAgY2xhc3MgUGFja0JpdG1hcEluZGV4VjEgZXh0ZW5kcyBCYXNlUGFja0JpdG1hcEluZGV4IHsKIAkJCWJpdG1hcHMuYWRkKHNiKTsKIAkJfQogCi0JCXRoaXMucmV2ZXJzZUluZGV4ID0gcmV2ZXJzZUluZGV4U3VwcGxpZXIuZ2V0KCk7CisJCVBhY2tSZXZlcnNlSW5kZXggY29tcHV0ZWRSZXZlcnNlSW5kZXg7CisJCWlmIChsb2FkUGFyYWxsZWxSZXZJbmRleCAmJiByZXZlcnNlSW5kZXhGdXR1cmUgIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQljb21wdXRlZFJldmVyc2VJbmRleCA9IHJldmVyc2VJbmRleEZ1dHVyZS5nZXQoKTsKKwkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHwgRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBGYWxsYmFjayB0byBsb2FkaW5nIHJldmVyc2UgaW5kZXggdGhyb3VnaCBhIHN1cHBsaWVyLgorCQkJCWNvbXB1dGVkUmV2ZXJzZUluZGV4ID0gcmV2ZXJzZUluZGV4U3VwcGxpZXIuZ2V0KCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljb21wdXRlZFJldmVyc2VJbmRleCA9IHJldmVyc2VJbmRleFN1cHBsaWVyLmdldCgpOworCQl9CisJCXRoaXMucmV2ZXJzZUluZGV4ID0gY29tcHV0ZWRSZXZlcnNlSW5kZXg7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tEaXJlY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tEaXJlY3RvcnkuamF2YQppbmRleCA2YTU5NjY5Li4xNjc2ZDhiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0RpcmVjdG9yeS5qYXZhCkBAIC02NSwxMiArNjUsMTIgQEAgY2xhc3MgUGFja0RpcmVjdG9yeSB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFja0xpc3QgTk9fUEFDS1MgPSBuZXcgUGFja0xpc3QoRmlsZVNuYXBzaG90LkRJUlRZLAogCQkJbmV3IFBhY2tbMF0pOwogCi0JcHJpdmF0ZSBmaW5hbCBDb25maWcgY29uZmlnOwotCiAJcHJpdmF0ZSBmaW5hbCBGaWxlIGRpcmVjdG9yeTsKIAogCXByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPFBhY2tMaXN0PiBwYWNrTGlzdDsKIAorCXByaXZhdGUgZmluYWwgYm9vbGVhbiB0cnVzdEZvbGRlclN0YXQ7CisKIAkvKioKIAkgKiBJbml0aWFsaXplIGEgcmVmZXJlbmNlIHRvIGFuIG9uLWRpc2sgJ3BhY2snIGRpcmVjdG9yeS4KIAkgKgpAQCAtODAsOSArODAsMTYgQEAgY2xhc3MgUGFja0RpcmVjdG9yeSB7CiAJICogICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgdGhlIHtAY29kZSBwYWNrfSBkaXJlY3RvcnkuCiAJICovCiAJUGFja0RpcmVjdG9yeShDb25maWcgY29uZmlnLCBGaWxlIGRpcmVjdG9yeSkgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKIAkJdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CiAJCXBhY2tMaXN0ID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KE5PX1BBQ0tTKTsKKworCQkvLyBXaGV0aGVyIHRvIHRydXN0IHRoZSBwYWNrIGZvbGRlcidzIG1vZGlmaWNhdGlvbiB0aW1lLiBJZiBzZXQgdG8gZmFsc2UKKwkJLy8gd2Ugd2lsbCBhbHdheXMgc2NhbiB0aGUgLmdpdC9vYmplY3RzL3BhY2sgZm9sZGVyIHRvIGNoZWNrIGZvciBuZXcKKwkJLy8gcGFjayBmaWxlcy4gSWYgc2V0IHRvIHRydWUgKGRlZmF1bHQpIHdlIHVzZSB0aGUgZm9sZGVyJ3Mgc2l6ZSwKKwkJLy8gbW9kaWZpY2F0aW9uIHRpbWUsIGFuZCBrZXkgKGlub2RlKSBhbmQgYXNzdW1lIHRoYXQgbm8gbmV3IHBhY2sgZmlsZXMKKwkJLy8gY2FuIGJlIGluIHRoaXMgZm9sZGVyIGlmIHRoZXNlIGF0dHJpYnV0ZXMgaGF2ZSBub3QgY2hhbmdlZC4KKwkJdHJ1c3RGb2xkZXJTdGF0ID0gY29uZmlnLmdldEJvb2xlYW4oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVFJVU1RGT0xERVJTVEFULCB0cnVlKTsKIAl9CiAKIAkvKioKQEAgLTM1MywxNiArMzYwLDYgQEAgcHJpdmF0ZSBib29sZWFuIGRvTG9nRXhwb25lbnRpYWxCYWNrb2ZmKGludCBuKSB7CiAJfQogCiAJYm9vbGVhbiBzZWFyY2hQYWNrc0FnYWluKFBhY2tMaXN0IG9sZCkgewotCQkvLyBXaGV0aGVyIHRvIHRydXN0IHRoZSBwYWNrIGZvbGRlcidzIG1vZGlmaWNhdGlvbiB0aW1lLiBJZiBzZXQKLQkJLy8gdG8gZmFsc2Ugd2Ugd2lsbCBhbHdheXMgc2NhbiB0aGUgLmdpdC9vYmplY3RzL3BhY2sgZm9sZGVyIHRvCi0JCS8vIGNoZWNrIGZvciBuZXcgcGFjayBmaWxlcy4gSWYgc2V0IHRvIHRydWUgKGRlZmF1bHQpIHdlIHVzZSB0aGUKLQkJLy8gbGFzdG1vZGlmaWVkIGF0dHJpYnV0ZSBvZiB0aGUgZm9sZGVyIGFuZCBhc3N1bWUgdGhhdCBubyBuZXcKLQkJLy8gcGFjayBmaWxlcyBjYW4gYmUgaW4gdGhpcyBmb2xkZXIgaWYgaGlzIG1vZGlmaWNhdGlvbiB0aW1lIGhhcwotCQkvLyBub3QgY2hhbmdlZC4KLQkJYm9vbGVhbiB0cnVzdEZvbGRlclN0YXQgPSBjb25maWcuZ2V0Qm9vbGVhbigKLQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwKLQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UUlVTVEZPTERFUlNUQVQsIHRydWUpOwotCiAJCXJldHVybiAoKCF0cnVzdEZvbGRlclN0YXQpIHx8IG9sZC5zbmFwc2hvdC5pc01vZGlmaWVkKGRpcmVjdG9yeSkpCiAJCQkJJiYgb2xkICE9IHNjYW5QYWNrcyhvbGQpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5LmphdmEKaW5kZXggZmJmMGFlOS4uMWRiNGY3NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5LmphdmEKQEAgLTMwLDEwICszMCwxMiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5maWxlLkRpcmVjdG9yeU5vdEVtcHR5RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5Ob1N1Y2hGaWxlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkRpZ2VzdElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKQEAgLTYwLDYgKzYyLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29yZUNvbmZpZy5UcnVzdFBhY2tlZFJlZnNTdGF0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKQEAgLTE3Nyw2ICsxODAsMTAgQEAgcHVibGljIGNsYXNzIFJlZkRpcmVjdG9yeSBleHRlbmRzIFJlZkRhdGFiYXNlIHsKIAogCXByaXZhdGUgTGlzdDxJbnRlZ2VyPiByZXRyeVNsZWVwTXMgPSBSRVRSWV9TTEVFUF9NUzsKIAorCXByaXZhdGUgZmluYWwgYm9vbGVhbiB0cnVzdEZvbGRlclN0YXQ7CisKKwlwcml2YXRlIGZpbmFsIFRydXN0UGFja2VkUmVmc1N0YXQgdHJ1c3RQYWNrZWRSZWZzU3RhdDsKKwogCVJlZkRpcmVjdG9yeShGaWxlUmVwb3NpdG9yeSBkYikgewogCQlmaW5hbCBGUyBmcyA9IGRiLmdldEZTKCk7CiAJCXBhcmVudCA9IGRiOwpAQCAtMTg4LDYgKzE5NSwxMyBAQCBwdWJsaWMgY2xhc3MgUmVmRGlyZWN0b3J5IGV4dGVuZHMgUmVmRGF0YWJhc2UgewogCiAJCWxvb3NlUmVmcy5zZXQoUmVmTGlzdC48TG9vc2VSZWY+IGVtcHR5TGlzdCgpKTsKIAkJcGFja2VkUmVmcy5zZXQoTk9fUEFDS0VEX1JFRlMpOworCQl0cnVzdEZvbGRlclN0YXQgPSBkYi5nZXRDb25maWcoKQorCQkJCS5nZXRCb29sZWFuKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09SRV9TRUNUSU9OLAorCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVFJVU1RGT0xERVJTVEFULCB0cnVlKTsKKwkJdHJ1c3RQYWNrZWRSZWZzU3RhdCA9IGRiLmdldENvbmZpZygpCisJCQkJLmdldEVudW0oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCisJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9UUlVTVF9QQUNLRURfUkVGU19TVEFULAorCQkJCQkJVHJ1c3RQYWNrZWRSZWZzU3RhdC5VTlNFVCk7CiAJfQogCiAJUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgewpAQCAtODg5LDEzICs5MDMsMzAgQEAgZWxzZSBpZiAoMCA8PSAoaWR4ID0gcGFja2VkLmZpbmQoZHN0LmdldE5hbWUoKSkpKQogCX0KIAogCVBhY2tlZFJlZkxpc3QgZ2V0UGFja2VkUmVmcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gdHJ1c3RGb2xkZXJTdGF0ID0gZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpLmdldEJvb2xlYW4oCi0JCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sCi0JCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVFJVU1RGT0xERVJTVEFULCB0cnVlKTsKLQogCQlmaW5hbCBQYWNrZWRSZWZMaXN0IGN1ckxpc3QgPSBwYWNrZWRSZWZzLmdldCgpOwotCQlpZiAodHJ1c3RGb2xkZXJTdGF0ICYmICFjdXJMaXN0LnNuYXBzaG90LmlzTW9kaWZpZWQocGFja2VkUmVmc0ZpbGUpKSB7Ci0JCQlyZXR1cm4gY3VyTGlzdDsKKworCQlzd2l0Y2ggKHRydXN0UGFja2VkUmVmc1N0YXQpIHsKKwkJY2FzZSBORVZFUjoKKwkJCWJyZWFrOworCQljYXNlIEFGVEVSX09QRU46CisJCQl0cnkgKElucHV0U3RyZWFtIHN0cmVhbSA9IEZpbGVzCisJCQkJCS5uZXdJbnB1dFN0cmVhbShwYWNrZWRSZWZzRmlsZS50b1BhdGgoKSkpIHsKKwkJCQkvLyBvcGVuIHRoZSBmaWxlIHRvIHJlZnJlc2ggYXR0cmlidXRlcyAob24gc29tZSBORlMgY2xpZW50cykKKwkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE5vU3VjaEZpbGVFeGNlcHRpb24gZSkgeworCQkJCS8vIElnbm9yZSBhcyBwYWNrZWQtcmVmcyBtYXkgbm90IGV4aXN0CisJCQl9CisJCQkvLyRGQUxMLVRIUk9VR0gkCisJCWNhc2UgQUxXQVlTOgorCQkJaWYgKCFjdXJMaXN0LnNuYXBzaG90LmlzTW9kaWZpZWQocGFja2VkUmVmc0ZpbGUpKSB7CisJCQkJcmV0dXJuIGN1ckxpc3Q7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBVTlNFVDoKKwkJCWlmICh0cnVzdEZvbGRlclN0YXQKKwkJCQkJJiYgIWN1ckxpc3Quc25hcHNob3QuaXNNb2RpZmllZChwYWNrZWRSZWZzRmlsZSkpIHsKKwkJCQlyZXR1cm4gY3VyTGlzdDsKKwkJCX0KKwkJCWJyZWFrOwogCQl9CiAKIAkJZmluYWwgUGFja2VkUmVmTGlzdCBuZXdMaXN0ID0gcmVhZFBhY2tlZFJlZnMoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9pby9DYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2lvL0NhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyMDk1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9pby9DYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyLCBUZW5jZW50LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworCisvKioKKyAqIEFuIE91dHB1dFN0cmVhbSB0aGF0IGtlZXBzIGEgZGlnZXN0IGFuZCBjaGVja3MgZXZlcnkgTiBieXRlcyBmb3IKKyAqIGNhbmNlbGxhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIENhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKKworCS8qKiBUaGUgT3V0cHV0U3RyZWFtIGNoZWNrcyBldmVyeSB0aGlzIHZhbHVlIGZvciBjYW5jZWxsYXRpb24gKiovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyA9IDEyOCAqIDEwMjQ7CisKKwlwcml2YXRlIGZpbmFsIFByb2dyZXNzTW9uaXRvciB3cml0ZU1vbml0b3I7CisKKwlwcml2YXRlIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQ7CisKKwlwcml2YXRlIGZpbmFsIE1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOworCisJcHJpdmF0ZSBsb25nIGNvdW50OworCisJcHJpdmF0ZSBsb25nIGNoZWNrQ2FuY2VsQXQ7CisKKwkvKioKKwkgKiBJbml0aWFsaXplIGEgQ2FuY2VsbGFibGVEaWdlc3RPdXRwdXRTdHJlYW0uCisJICoKKwkgKiBAcGFyYW0gd3JpdGVNb25pdG9yCisJICogICAgICAgICAgICBtb25pdG9yIHRvIHVwZGF0ZSBvbiBvdXRwdXQgcHJvZ3Jlc3MgYW5kIGNoZWNrIGNhbmNlbC4KKwkgKiBAcGFyYW0gb3V0CisJICogICAgICAgICAgICB0YXJnZXQgc3RyZWFtIHRvIHJlY2VpdmUgYWxsIGNvbnRlbnRzLgorCSAqLworCXB1YmxpYyBDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbShQcm9ncmVzc01vbml0b3Igd3JpdGVNb25pdG9yLAorCQkJT3V0cHV0U3RyZWFtIG91dCkgeworCQl0aGlzLndyaXRlTW9uaXRvciA9IHdyaXRlTW9uaXRvcjsKKwkJdGhpcy5vdXQgPSBvdXQ7CisJCXRoaXMuY2hlY2tDYW5jZWxBdCA9IEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0s7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBtb25pdG9yIHdoaWNoIGlzIHVzZWQgdG8gdXBkYXRlIG9uIG91dHB1dCBwcm9ncmVzcyBhbmQgY2hlY2sKKwkgKiBjYW5jZWwuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBtb25pdG9yCisJICovCisJcHVibGljIGZpbmFsIFByb2dyZXNzTW9uaXRvciBnZXRXcml0ZU1vbml0b3IoKSB7CisJCXJldHVybiB3cml0ZU1vbml0b3I7CisJfQorCisJLyoqCisJICogT2J0YWluIHRoZSBjdXJyZW50IFNIQS0xIGRpZ2VzdC4KKwkgKgorCSAqIEByZXR1cm4gU0hBLTEgZGlnZXN0CisJICovCisJcHVibGljIGZpbmFsIGJ5dGVbXSBnZXREaWdlc3QoKSB7CisJCXJldHVybiBtZC5kaWdlc3QoKTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc2luY2Ugc3RyZWFtIHN0YXJ0LgorCSAqCisJICogQHJldHVybiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBzaW5jZSBzdHJlYW0gc3RhcnQuCisJICovCisJcHVibGljIGZpbmFsIGxvbmcgbGVuZ3RoKCkgeworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGNoZWNrQ2FuY2VsQXQgPD0gY291bnQpIHsKKwkJCWlmICh3cml0ZU1vbml0b3IuaXNDYW5jZWxsZWQoKSkgeworCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZElPRXhjZXB0aW9uKCk7CisJCQl9CisJCQljaGVja0NhbmNlbEF0ID0gY291bnQgKyBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLOworCQl9CisKKwkJb3V0LndyaXRlKGIpOworCQltZC51cGRhdGUoKGJ5dGUpIGIpOworCQljb3VudCsrOworCX0KKworCS8qKiB7QGluaGVyaXREb2N9ICovCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXdoaWxlICgwIDwgbGVuKSB7CisJCQlpZiAoY2hlY2tDYW5jZWxBdCA8PSBjb3VudCkgeworCQkJCWlmICh3cml0ZU1vbml0b3IuaXNDYW5jZWxsZWQoKSkgeworCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbigpOworCQkJCX0KKwkJCQljaGVja0NhbmNlbEF0ID0gY291bnQgKyBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLOworCQkJfQorCisJCQlpbnQgbiA9IE1hdGgubWluKGxlbiwgQllURVNfVE9fV1JJVEVfQkVGT1JFX0NBTkNFTF9DSEVDSyk7CisJCQlvdXQud3JpdGUoYiwgb2ZmLCBuKTsKKwkJCW1kLnVwZGF0ZShiLCBvZmYsIG4pOworCQkJY291bnQgKz0gbjsKKworCQkJb2ZmICs9IG47CisJCQlsZW4gLT0gbjsKKwkJfQorCX0KKworCS8qKiB7QGluaGVyaXREb2N9ICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlvdXQuZmx1c2goKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggNzEwNGI5NC4uMmQwZmUyOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja091dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTcsMTAgKzE3LDggQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvLkNhbmNlbGxhYmxlRGlnZXN0T3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuTkI7CiAKQEAgLTI4LDI1ICsyNiwxNCBAQAogICogQ3VzdG9tIG91dHB1dCBzdHJlYW0gdG8gc3VwcG9ydAogICoge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrLlBhY2tXcml0ZXJ9LgogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUGFja091dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0sgPSAxMjggKiAxMDI0OwotCi0JcHJpdmF0ZSBmaW5hbCBQcm9ncmVzc01vbml0b3Igd3JpdGVNb25pdG9yOwotCi0JcHJpdmF0ZSBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0OworcHVibGljIGZpbmFsIGNsYXNzIFBhY2tPdXRwdXRTdHJlYW0gZXh0ZW5kcyBDYW5jZWxsYWJsZURpZ2VzdE91dHB1dFN0cmVhbSB7CiAKIAlwcml2YXRlIGZpbmFsIFBhY2tXcml0ZXIgcGFja1dyaXRlcjsKIAotCXByaXZhdGUgZmluYWwgTWVzc2FnZURpZ2VzdCBtZCA9IENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCk7Ci0KLQlwcml2YXRlIGxvbmcgY291bnQ7Ci0KIAlwcml2YXRlIGZpbmFsIGJ5dGVbXSBoZWFkZXJCdWZmZXIgPSBuZXcgYnl0ZVszMl07CiAKIAlwcml2YXRlIGZpbmFsIGJ5dGVbXSBjb3B5QnVmZmVyID0gbmV3IGJ5dGVbNjQgPDwgMTBdOwogCi0JcHJpdmF0ZSBsb25nIGNoZWNrQ2FuY2VsQXQ7Ci0KIAlwcml2YXRlIGJvb2xlYW4gb2ZzRGVsdGE7CiAKIAkvKioKQEAgLTY2LDQ4ICs1Myw4IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBQYWNrT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKIAkgKi8KIAlwdWJsaWMgUGFja091dHB1dFN0cmVhbShmaW5hbCBQcm9ncmVzc01vbml0b3Igd3JpdGVNb25pdG9yLAogCQkJZmluYWwgT3V0cHV0U3RyZWFtIG91dCwgZmluYWwgUGFja1dyaXRlciBwdykgewotCQl0aGlzLndyaXRlTW9uaXRvciA9IHdyaXRlTW9uaXRvcjsKLQkJdGhpcy5vdXQgPSBvdXQ7CisJCXN1cGVyKHdyaXRlTW9uaXRvciwgb3V0KTsKIAkJdGhpcy5wYWNrV3JpdGVyID0gcHc7Ci0JCXRoaXMuY2hlY2tDYW5jZWxBdCA9IEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0s7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY291bnQrKzsKLQkJb3V0LndyaXRlKGIpOwotCQltZC51cGRhdGUoKGJ5dGUpIGIpOwotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGxlbikgewotCQkJZmluYWwgaW50IG4gPSBNYXRoLm1pbihsZW4sIEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0spOwotCQkJY291bnQgKz0gbjsKLQotCQkJaWYgKGNoZWNrQ2FuY2VsQXQgPD0gY291bnQpIHsKLQkJCQlpZiAod3JpdGVNb25pdG9yLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKAotCQkJCQkJCUpHaXRUZXh0LmdldCgpLnBhY2tpbmdDYW5jZWxsZWREdXJpbmdPYmplY3RzV3JpdGluZyk7Ci0JCQkJfQotCQkJCWNoZWNrQ2FuY2VsQXQgPSBjb3VudCArIEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0s7Ci0JCQl9Ci0KLQkJCW91dC53cml0ZShiLCBvZmYsIG4pOwotCQkJbWQudXBkYXRlKGIsIG9mZiwgbik7Ci0KLQkJCW9mZiArPSBuOwotCQkJbGVuIC09IG47Ci0JCX0KLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb3V0LmZsdXNoKCk7CiAJfQogCiAJZmluYWwgdm9pZCB3cml0ZUZpbGVIZWFkZXIoaW50IHZlcnNpb24sIGxvbmcgb2JqZWN0Q291bnQpCkBAIC0xNjAsNyArMTA3LDcgQEAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVIZWFkZXIoT2JqZWN0VG9QYWNrIG90cCwgbG9uZyByYXdMZW5ndGgpCiAJCU9iamVjdFRvUGFjayBiID0gb3RwLmdldERlbHRhQmFzZSgpOwogCQlpZiAoYiAhPSBudWxsICYmIChiLmlzV3JpdHRlbigpICYgb2ZzRGVsdGEpKSB7IC8vIE5vbi1zaG9ydC1jaXJjdWl0IGxvZ2ljIGlzIGludGVudGlvbmFsCiAJCQlpbnQgbiA9IG9iamVjdEhlYWRlcihyYXdMZW5ndGgsIE9CSl9PRlNfREVMVEEsIGhlYWRlckJ1ZmZlcik7Ci0JCQluID0gb2ZzRGVsdGEoY291bnQgLSBiLmdldE9mZnNldCgpLCBoZWFkZXJCdWZmZXIsIG4pOworCQkJbiA9IG9mc0RlbHRhKGxlbmd0aCgpIC0gYi5nZXRPZmZzZXQoKSwgaGVhZGVyQnVmZmVyLCBuKTsKIAkJCXdyaXRlKGhlYWRlckJ1ZmZlciwgMCwgbik7CiAJCX0gZWxzZSBpZiAob3RwLmlzRGVsdGFSZXByZXNlbnRhdGlvbigpKSB7CiAJCQlpbnQgbiA9IG9iamVjdEhlYWRlcihyYXdMZW5ndGgsIE9CSl9SRUZfREVMVEEsIGhlYWRlckJ1ZmZlcik7CkBAIC0yMDksMjAgKzE1Niw2IEBAIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBvZnNEZWx0YVZhckludExlbmd0aChsb25nIHYpIHsKIAl9CiAKIAl2b2lkIGVuZE9iamVjdCgpIHsKLQkJd3JpdGVNb25pdG9yLnVwZGF0ZSgxKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc2luY2Ugc3RyZWFtIHN0YXJ0LgotCSAqCi0JICogQHJldHVybiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBzaW5jZSBzdHJlYW0gc3RhcnQuCi0JICovCi0JcHVibGljIGZpbmFsIGxvbmcgbGVuZ3RoKCkgewotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqIEByZXR1cm4gb2J0YWluIHRoZSBjdXJyZW50IFNIQS0xIGRpZ2VzdC4gKi8KLQlmaW5hbCBieXRlW10gZ2V0RGlnZXN0KCkgewotCQlyZXR1cm4gbWQuZGlnZXN0KCk7CisJCWdldFdyaXRlTW9uaXRvcigpLnVwZGF0ZSgxKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3RyYW5zcG9ydC9zc2gvT3BlblNzaENvbmZpZ0ZpbGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZS5qYXZhCmluZGV4IDY0OGQ0YTEuLjY1OWNjYjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvdHJhbnNwb3J0L3NzaC9PcGVuU3NoQ29uZmlnRmlsZS5qYXZhCkBAIC01MDIsNiArNTAyLDk4IEBAIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmbGFnKFN0cmluZyB2YWx1ZSkgewogCX0KIAogCS8qKgorCSAqIENvbnZlcnRzIGFuIE9wZW5TU0ggdGltZSB2YWx1ZSBpbnRvIGEgbnVtYmVyIG9mIHNlY29uZHMuIFRoZSBmb3JtYXQgaXMKKwkgKiBkZWZpbmVkIGJ5IE9wZW5TU0ggYXMgYSBzZXF1ZW5jZSBvZiAocG9zaXRpdmUpIGludGVnZXJzIHdpdGggc3VmZml4ZXMgZm9yCisJICogc2Vjb25kcywgbWludXRlcywgaG91cnMsIGRheXMsIGFuZCB3ZWVrcy4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZQorCSAqICAgICAgICAgICAgdG8gY29udmVydAorCSAqIEByZXR1cm4gdGhlIHBhcnNlZCB2YWx1ZSBhcyBhIG51bWJlciBvZiBzZWNvbmRzLCBvciAtMSBpZiB0aGUgdmFsdWUgaXMKKwkgKiAgICAgICAgIG5vdCBhIHZhbGlkIE9wZW5TU0ggdGltZSB2YWx1ZQorCSAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9tYW4ub3BlbmJzZC5vcmcvc3NoZF9jb25maWcuNSNUSU1FX0ZPUk1BVFMiPk9wZW5CU0QKKwkgKiAgICAgIG1hbiA1IHNzaGRfY29uZmlnLCBzZWN0aW9uIFRJTUUgRk9STUFUUzwvYT4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCB0aW1lU3BlYyhTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl0cnkgeworCQkJaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOworCQkJaW50IGkgPSAwOworCQkJaW50IHNlY29uZHMgPSAwOworCQkJYm9vbGVhbiB2YWx1ZVNlZW4gPSBmYWxzZTsKKwkJCXdoaWxlIChpIDwgbGVuZ3RoKSB7CisJCQkJLy8gU2tpcCB3aGl0ZXNwYWNlCisJCQkJY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKKwkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpIHsKKwkJCQkJaSsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKGNoID09ICcrJykgeworCQkJCQkvLyBPcGVuU1NIIHVzZXMgc3RydG9sIHdpdGggYmFzZSAxMDogYSBsZWFkaW5nIHBsdXMgc2lnbiBpcworCQkJCQkvLyBhbGxvd2VkLgorCQkJCQlpKys7CisJCQkJfQorCQkJCWludCB2YWwgPSAwOworCQkJCWludCBqID0gaTsKKwkJCQl3aGlsZSAoaiA8IGxlbmd0aCkgeworCQkJCQljaCA9IHZhbHVlLmNoYXJBdChqKyspOworCQkJCQlpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworCQkJCQkJdmFsID0gTWF0aC5hZGRFeGFjdChNYXRoLm11bHRpcGx5RXhhY3QodmFsLCAxMCksCisJCQkJCQkJCWNoIC0gJzAnKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWotLTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChpID09IGopIHsKKwkJCQkJLy8gTm8gZGlnaXRzIHNlZW4KKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlpID0gajsKKwkJCQlpbnQgbXVsdGlwbGllciA9IDE7CisJCQkJaWYgKGkgPCBsZW5ndGgpIHsKKwkJCQkJY2ggPSB2YWx1ZS5jaGFyQXQoaSsrKTsKKwkJCQkJc3dpdGNoIChjaCkgeworCQkJCQljYXNlICdzJzoKKwkJCQkJY2FzZSAnUyc6CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnbSc6CisJCQkJCWNhc2UgJ00nOgorCQkJCQkJbXVsdGlwbGllciA9IDYwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ2gnOgorCQkJCQljYXNlICdIJzoKKwkJCQkJCW11bHRpcGxpZXIgPSAzNjAwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ2QnOgorCQkJCQljYXNlICdEJzoKKwkJCQkJCW11bHRpcGxpZXIgPSAyNCAqIDM2MDA7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAndyc6CisJCQkJCWNhc2UgJ1cnOgorCQkJCQkJbXVsdGlwbGllciA9IDcgKiAyNCAqIDM2MDA7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKSkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJLy8gSW52YWxpZCB0aW1lIHNwZWMKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJfQorCQkJCX0KKwkJCQlzZWNvbmRzID0gTWF0aC5hZGRFeGFjdChzZWNvbmRzLAorCQkJCQkJTWF0aC5tdWx0aXBseUV4YWN0KHZhbCwgbXVsdGlwbGllcikpOworCQkJCXZhbHVlU2VlbiA9IHRydWU7CisJCQl9CisJCQlyZXR1cm4gdmFsdWVTZWVuID8gc2Vjb25kcyA6IC0xOworCQl9IGNhdGNoIChBcml0aG1ldGljRXhjZXB0aW9uIGUpIHsKKwkJCS8vIE92ZXJmbG93CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKioKIAkgKiBSZXRyaWV2ZXMgdGhlIGxvY2FsIHVzZXIgbmFtZSBhcyBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3IuCiAJICoKIAkgKiBAcmV0dXJuIHRoZSB1c2VyIG5hbWUKQEAgLTU0OSw2ICs2NDEsNyBAQCBwdWJsaWMgc3RhdGljIGNsYXNzIEhvc3RFbnRyeSBpbXBsZW1lbnRzIFNzaENvbmZpZ1N0b3JlLkhvc3RDb25maWcgewogCQkJTElTVF9LRVlTLmFkZChTc2hDb25zdGFudHMuR0xPQkFMX0tOT1dOX0hPU1RTX0ZJTEUpOwogCQkJTElTVF9LRVlTLmFkZChTc2hDb25zdGFudHMuU0VORF9FTlYpOwogCQkJTElTVF9LRVlTLmFkZChTc2hDb25zdGFudHMuVVNFUl9LTk9XTl9IT1NUU19GSUxFKTsKKwkJCUxJU1RfS0VZUy5hZGQoU3NoQ29uc3RhbnRzLkFERF9LRVlTX1RPX0FHRU5UKTsgLy8gY29uZmlybSB0aW1lU3BlYwogCQl9CiAKIAkJLyoqCkBAIC04NzEsNyArOTY0LDggQEAgdm9pZCBzdWJzdGl0dXRlKFN0cmluZyBvcmlnaW5hbEhvc3ROYW1lLCBpbnQgcG9ydCwgU3RyaW5nIHVzZXJOYW1lLAogCQkJaWYgKG9wdGlvbnMgIT0gbnVsbCkgewogCQkJCS8vIEhPU1ROQU1FIGFscmVhZHkgZG9uZSBhYm92ZQogCQkJCVN0cmluZyB2YWx1ZSA9IG9wdGlvbnMuZ2V0KFNzaENvbnN0YW50cy5JREVOVElUWV9BR0VOVCk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiAhU3NoQ29uc3RhbnRzLk5PTkUuZXF1YWxzKHZhbHVlKQorCQkJCQkJJiYgIVNzaENvbnN0YW50cy5FTlZfU1NIX0FVVEhfU09DS0VULmVxdWFscyh2YWx1ZSkpIHsKIAkJCQkJdmFsdWUgPSByLnN1YnN0aXR1dGUodmFsdWUsIFJlcGxhY2VyLkRFRkFVTFRfVE9LRU5TLCB0cnVlKTsKIAkJCQkJdmFsdWUgPSB0b0ZpbGUodmFsdWUsIGhvbWUpLmdldFBhdGgoKTsKIAkJCQkJb3B0aW9ucy5wdXQoU3NoQ29uc3RhbnRzLklERU5USVRZX0FHRU5ULCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BYmJyZXZDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldkNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMDljZmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BYmJyZXZDb25maWcuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMiwgIE1hdHRoaWFzIFNvaG4gPG1hdHRoaWFzLnNvaG5Ac2FwLmNvbT4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5saWI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuVHlwZWRDb25maWdHZXR0ZXIuVU5TRVRfSU5UOworCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKKworLyoqCisgKiBHaXQgY29uZmlndXJhdGlvbiBvcHRpb24gPGEKKyAqIGhyZWY9aHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1jb25maWcjRG9jdW1lbnRhdGlvbi9naXQtY29uZmlnLnR4dC1jb3JlYWJicmV2Ij4KKyAqIGNvcmUuYWJicmV2PC9hPgorICoKKyAqIEBzaW5jZSA2LjEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFiYnJldkNvbmZpZyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX05PID0gIm5vIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0FVVE8gPSAiYXV0byI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBtaW5pbXVtIHZhbHVlIG9mIGFiYnJldgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9BQkJSRVYgPSA0OworCisJLyoqCisJICogQ2FwIGNvbmZpZ3VyZWQgY29yZS5hYmJyZXYgdG8gcmFuZ2UgYmV0d2VlbiBtaW5pbXVtIG9mIDQgYW5kIG51bWJlciBvZgorCSAqIGhleC1kaWdpdHMgb2YgYSBmdWxsIG9iamVjdCBpZC4KKwkgKgorCSAqIEBwYXJhbSBsZW4KKwkgKiAgICAgICAgICAgIGNvbmZpZ3VyZWQgbnVtYmVyIG9mIGhleC1kaWdpdHMgdG8gYWJicmV2aWF0ZSBvYmplY3QgaWRzIHRvCisJICogQHJldHVybiBjb3JlLmFiYnJldiBjYXBwZWQgdG8gcmFuZ2UgYmV0d2VlbiBtaW5pbXVtIG9mIDQgYW5kIG51bWJlciBvZgorCSAqICAgICAgICAgaGV4LWRpZ2l0cyBvZiBhIGZ1bGwgb2JqZWN0IGlkCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgY2FwQWJicmV2KGludCBsZW4pIHsKKwkJcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KE1JTl9BQkJSRVYsIGxlbiksCisJCQkJQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKTsKKwl9CisKKwkvKioKKwkgKiBObyBhYmJyZXZpYXRpb24KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIEFiYnJldkNvbmZpZyBOTyA9IG5ldyBBYmJyZXZDb25maWcoCisJCQlDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpOworCisJLyoqCisJICogUGFyc2Ugc3RyaW5nIHZhbHVlIG9mIGNvcmUuYWJicmV2IGdpdCBvcHRpb24gZm9yIGEgZ2l2ZW4gcmVwb3NpdG9yeQorCSAqCisJICogQHBhcmFtIHJlcG8KKwkgKiAgICAgICAgICAgIHJlcG9zaXRvcnkKKwkgKiBAcmV0dXJuIHRoZSBwYXJzZWQgQWJicmV2Q29uZmlnCisJICogQHRocm93cyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHZhbHVlIG9mIGNvcmUuYWJicmV2IGlzIGludmFsaWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFiYnJldkNvbmZpZyBwYXJzZUZyb21Db25maWcoUmVwb3NpdG9yeSByZXBvKQorCQkJdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKwkJQ29uZmlnIGNvbmZpZyA9IHJlcG8uZ2V0Q29uZmlnKCk7CisJCVN0cmluZyB2YWx1ZSA9IGNvbmZpZy5nZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sCisJCQkJbnVsbCwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQUJCUkVWKTsKKwkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZShWQUxVRV9BVVRPKSkgeworCQkJcmV0dXJuIGF1dG8ocmVwbyk7CisJCX0KKwkJaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoVkFMVUVfTk8pKSB7CisJCQlyZXR1cm4gTk87CisJCX0KKwkJdHJ5IHsKKwkJCWludCBsZW4gPSBjb25maWcuZ2V0SW50SW5SYW5nZShDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwKKwkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQUJCUkVWLCBNSU5fQUJCUkVWLAorCQkJCQlDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgsIFVOU0VUX0lOVCk7CisJCQlpZiAobGVuID09IFVOU0VUX0lOVCkgeworCQkJCS8vIFVuc2V0IHdhcyBjaGVja2VkIGFib3ZlLiBJZiB3ZSBnZXQgVU5TRVRfSU5UIGhlcmUsIHRoZW4KKwkJCQkvLyBlaXRoZXIgdGhlIHZhbHVlIHdhcyBVTlNFVF9JTlQsIG9yIGl0IHdhcyBhbiBpbnZhbGlkIHZhbHVlCisJCQkJLy8gKG5vdCBhbiBpbnRlZ2VyLCBvciBvdXQgb2YgcmFuZ2UpLCBhbmQgRUdpdCdzCisJCQkJLy8gUmVwb3J0aW5nVHlwZWRHZXR0ZXIgY2F1Z2h0IHRoZSBleGNlcHRpb24gYW5kIGhhcyBsb2dnZWQgYQorCQkJCS8vIHdhcm5pbmcuIEluIGVpdGhlciBjYXNlIHdlIHNob3VsZCBmYWxsIGJhY2sgdG8gc29tZSBzYW5lCisJCQkJLy8gZGVmYXVsdC4KKwkJCQlsZW4gPSBPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CisJCQl9CisJCQlyZXR1cm4gbmV3IEFiYnJldkNvbmZpZyhsZW4pOworCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkQ29yZUFiYnJldiwgdmFsdWUpLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEFuIGFwcHJvcHJpYXRlIHZhbHVlIGlzIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSBhcHByb3hpbWF0ZSBudW1iZXIgb2YKKwkgKiBwYWNrZWQgb2JqZWN0cyBpbiBhIHJlcG9zaXRvcnksIHdoaWNoIGhvcGVmdWxseSBpcyBlbm91Z2ggZm9yIGFiYnJldmlhdGVkCisJICogb2JqZWN0IG5hbWVzIHRvIHN0YXkgdW5pcXVlIGZvciBzb21lIHRpbWUuCisJICoKKwkgKiBAcGFyYW0gcmVwbworCSAqIEByZXR1cm4gYXBwcm9wcmlhdGUgdmFsdWUgY29tcHV0ZWQgYmFzZWQgb24gdGhlIGFwcHJveGltYXRlIG51bWJlciBvZgorCSAqICAgICAgICAgcGFja2VkIG9iamVjdHMgaW4gYSByZXBvc2l0b3J5CisJICovCisJcHJpdmF0ZSBzdGF0aWMgQWJicmV2Q29uZmlnIGF1dG8oUmVwb3NpdG9yeSByZXBvKSB7CisJCWxvbmcgY291bnQgPSByZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0QXBwcm94aW1hdGVPYmplY3RDb3VudCgpOworCQlpZiAoY291bnQgPT0gLTEpIHsKKwkJCXJldHVybiBuZXcgQWJicmV2Q29uZmlnKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCk7CisJCX0KKwkJLy8gZmluZCBtc2IsIHJvdW5kIHRvIG5leHQgcG93ZXIgb2YgMgorCQlpbnQgbGVuID0gNjMgLSBMb25nLm51bWJlck9mTGVhZGluZ1plcm9zKGNvdW50KSArIDE7CisJCS8vIFdpdGggdGhlIG9yZGVyIG9mIDJebGVuIG9iamVjdHMsIHdlIGV4cGVjdCBhIGNvbGxpc2lvbiBhdAorCQkvLyAyXihsZW4vMikuIEJ1dCB3ZSBhbHNvIGNhcmUgYWJvdXQgaGV4IGNoYXJzLCBub3QgYml0cywgYW5kCisJCS8vIHRoZXJlIGFyZSA0IGJpdHMgcGVyIGhleC4gU28gYWxsIHRvZ2V0aGVyIHdlIG5lZWQgdG8gZGl2aWRlCisJCS8vIGJ5IDI7IGJ1dCB3ZSBhbHNvIHdhbnQgdG8gcm91bmQgb2RkIG51bWJlcnMgdXAsIGhlbmNlIGFkZGluZworCQkvLyBvbmUgYmVmb3JlIGRpdmlkaW5nLgorCQlsZW4gPSAobGVuICsgMSkgLyAyOworCQkvLyBmb3Igc21hbGwgcmVwb3MgdXNlIGF0IGxlYXN0IGZhbGxiYWNrIGxlbmd0aAorCQlyZXR1cm4gbmV3IEFiYnJldkNvbmZpZyhNYXRoLm1heChsZW4sIE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkpOworCX0KKworCS8qKgorCSAqIEFsbCBvdGhlciBwb3NzaWJsZSBhYmJyZXZpYXRpb24gbGVuZ3Rocy4gVmFsaWQgcmFuZ2UgNCB0byBudW1iZXIgb2YKKwkgKiBoZXgtZGlnaXRzIG9mIGFuIHVuYWJicmV2aWF0ZWQgb2JqZWN0IGlkICg0MCBmb3IgU0hBMSBvYmplY3QgaWRzLCBqZ2l0CisJICogZG9lc24ndCBzdXBwb3J0IFNIQTI1NiB5ZXQpLgorCSAqLworCXByaXZhdGUgaW50IGFiYnJldjsKKworCS8qKgorCSAqIEBwYXJhbSBhYmJyZXYKKwkgKi8KKwlwcml2YXRlIEFiYnJldkNvbmZpZyhpbnQgYWJicmV2KSB7CisJCXRoaXMuYWJicmV2ID0gY2FwQWJicmV2KGFiYnJldik7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBjb25maWd1cmVkIGFiYnJldmlhdGlvbiBsZW5ndGggZm9yIG9iamVjdCBpZHMuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBjb25maWd1cmVkIGFiYnJldmlhdGlvbiBsZW5ndGggZm9yIG9iamVjdCBpZHMKKwkgKi8KKwlwdWJsaWMgaW50IGdldCgpIHsKKwkJcmV0dXJuIGFiYnJldjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gSW50ZWdlci50b1N0cmluZyhhYmJyZXYpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZy5qYXZhCmluZGV4IDZkYTZmMTIuLmFhNjEzZDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZy5qYXZhCkBAIC0xMzgsNiArMTM4LDE4IEBAIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlKCkgewogCX0KIAogCS8qKgorCSAqIEdldCB0aGUgcmVtb3RlIHRoaXMgYnJhbmNoIGlzIGNvbmZpZ3VyZWQgdG8gcHVzaCB0by4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHJlbW90ZSB0aGlzIGJyYW5jaCBpcyBjb25maWd1cmVkIHRvIHB1c2ggdG8sIG9yIHtAY29kZSBudWxsfQorCSAqICAgICAgICAgaWYgbm90IGRlZmluZWQKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFN0cmluZyBnZXRQdXNoUmVtb3RlKCkgeworCQlyZXR1cm4gY29uZmlnLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX0JSQU5DSF9TRUNUSU9OLAorCQkJCWJyYW5jaE5hbWUsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1BVU0hfUkVNT1RFKTsKKwl9CisKKwkvKioKIAkgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHVwc3RyZWFtIGJyYW5jaCBhcyBpdCBpcyBjYWxsZWQgb24gdGhlIHJlbW90ZQogCSAqCiAJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdXBzdHJlYW0gYnJhbmNoIGFzIGl0IGlzIGNhbGxlZCBvbiB0aGUgcmVtb3RlLCBvcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0Q29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRDb25maWcuamF2YQppbmRleCAyMmUxZjk4Li41NWNjMDI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRDb25maWcuamF2YQpAQCAtMTgsMTEgKzE4LDEzIEBACiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnLkNvbmZpZ0VudW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnLlNlY3Rpb25QYXJzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5JTzsKQEAgLTM0LDIyICszNiw3NiBAQAogICogQHNpbmNlIDUuMTMKICAqLwogcHVibGljIGNsYXNzIENvbW1pdENvbmZpZyB7CisKIAkvKioKIAkgKiBLZXkgZm9yIHtAbGluayBDb25maWcjZ2V0KFNlY3Rpb25QYXJzZXIpfS4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIENvbmZpZy5TZWN0aW9uUGFyc2VyPENvbW1pdENvbmZpZz4gS0VZID0gQ29tbWl0Q29uZmlnOjpuZXc7CiAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VUID0gIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBIb3cgdG8gY2xlYW4gdXAgY29tbWl0IG1lc3NhZ2VzIHdoZW4gY29tbWl0dGluZy4KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgZW51bSBDbGVhbnVwTW9kZSBpbXBsZW1lbnRzIENvbmZpZ0VudW0geworCisJCS8qKgorCQkgKiB7QGxpbmsgI1dISVRFU1BBQ0V9LCBhZGRpdGlvbmFsbHkgcmVtb3ZlIGNvbW1lbnQgbGluZXMuCisJCSAqLworCQlTVFJJUCwKKworCQkvKioKKwkJICogUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGVtcHR5IGxpbmVzOworCQkgKiBjb2xsYXBzZSBtdWx0aXBsZSBlbXB0eSBsaW5lcyB0byBhIHNpbmdsZSBvbmUuCisJCSAqLworCQlXSElURVNQQUNFLAorCisJCS8qKgorCQkgKiBNYWtlIG5vIGNoYW5nZXMuCisJCSAqLworCQlWRVJCQVRJTSwKKworCQkvKioKKwkJICogT21pdCBldmVyeXRoaW5nIGZyb20gdGhlIGZpcnN0ICJzY2lzc29yIiBsaW5lIG9uLCB0aGVuIGFwcGx5CisJCSAqIHtAbGluayAjV0hJVEVTUEFDRX0uCisJCSAqLworCQlTQ0lTU09SUywKKworCQkvKioKKwkJICogVXNlIHtAbGluayAjU1RSSVB9IGZvciB1c2VyLWVkaXRlZCBtZXNzYWdlcywgb3RoZXJ3aXNlCisJCSAqIHtAbGluayAjV0hJVEVTUEFDRX0sIHVubGVzcyBvdmVycmlkZGVuIGJ5IGEgZ2l0IGNvbmZpZyBzZXR0aW5nIG90aGVyCisJCSAqIHRoYW4gREVGQVVMVC4KKwkJICovCisJCURFRkFVTFQ7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBTdHJpbmcgdG9Db25maWdWYWx1ZSgpIHsKKwkJCXJldHVybiBuYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlJPT1QpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIG1hdGNoQ29uZmlnVmFsdWUoU3RyaW5nIGluKSB7CisJCQlyZXR1cm4gdG9Db25maWdWYWx1ZSgpLmVxdWFscyhpbik7CisJCX0KKwl9CisKIAlwcml2YXRlIGZpbmFsIHN0YXRpYyBDaGFyc2V0IERFRkFVTFRfQ09NTUlUX01FU1NBR0VfRU5DT0RJTkcgPSBTdGFuZGFyZENoYXJzZXRzLlVURl84OwogCiAJcHJpdmF0ZSBTdHJpbmcgaTE4bkNvbW1pdEVuY29kaW5nOwogCiAJcHJpdmF0ZSBTdHJpbmcgY29tbWl0VGVtcGxhdGVQYXRoOwogCisJcHJpdmF0ZSBDbGVhbnVwTW9kZSBjbGVhbnVwTW9kZTsKKwogCXByaXZhdGUgQ29tbWl0Q29uZmlnKENvbmZpZyByYykgewogCQljb21taXRUZW1wbGF0ZVBhdGggPSByYy5nZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT01NSVRfU0VDVElPTiwKIAkJCQludWxsLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9DT01NSVRfVEVNUExBVEUpOwogCQlpMThuQ29tbWl0RW5jb2RpbmcgPSByYy5nZXRTdHJpbmcoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19TRUNUSU9OX0kxOE4sCiAJCQkJbnVsbCwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQ09NTUlUX0VOQ09ESU5HKTsKKwkJY2xlYW51cE1vZGUgPSByYy5nZXRFbnVtKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfQ09NTUlUX1NFQ1RJT04sIG51bGwsCisJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQ0xFQU5VUCwgQ2xlYW51cE1vZGUuREVGQVVMVCk7CiAJfQogCiAJLyoqCkBAIC03NSw2ICsxMzEsNDggQEAgcHVibGljIFN0cmluZyBnZXRDb21taXRFbmNvZGluZygpIHsKIAl9CiAKIAkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIHtAbGluayBDbGVhbnVwTW9kZX0gYXMgZ2l2ZW4gYnkgZ2l0IGNvbmZpZworCSAqIHtAY29kZSBjb21taXQuY2xlYW51cH0uCisJICoKKwkgKiBAcmV0dXJuIHRoZSB7QGxpbmsgQ2xlYW51cE1vZGV9OyB7QGxpbmsgQ2xlYW51cE1vZGUjREVGQVVMVH0gaWYgdGhlIGdpdAorCSAqICAgICAgICAgY29uZmlnIGlzIG5vdCBzZXQKKwkgKiBAc2luY2UgNi4xCisJICovCisJQE5vbk51bGwKKwlwdWJsaWMgQ2xlYW51cE1vZGUgZ2V0Q2xlYW51cE1vZGUoKSB7CisJCXJldHVybiBjbGVhbnVwTW9kZTsKKwl9CisKKwkvKioKKwkgKiBDb21wdXRlcyBhIG5vbi1kZWZhdWx0IHtAbGluayBDbGVhbnVwTW9kZX0gZnJvbSB0aGUgZ2l2ZW4gbW9kZSBhbmQgdGhlCisJICogZ2l0IGNvbmZpZy4KKwkgKgorCSAqIEBwYXJhbSBtb2RlCisJICogICAgICAgICAgICB7QGxpbmsgQ2xlYW51cE1vZGV9IHRvIHJlc29sdmUKKwkgKiBAcGFyYW0gZGVmYXVsdFN0cmlwCisJICogICAgICAgICAgICBpZiB7QGNvZGUgdHJ1ZX0gcmV0dXJuIHtAbGluayBDbGVhbnVwTW9kZSNTVFJJUH0gaWYgdGhlIGdpdAorCSAqICAgICAgICAgICAgY29uZmlnIGlzIGFsc28gImRlZmF1bHQiLCBvdGhlcndpc2UgcmV0dXJuCisJICogICAgICAgICAgICB7QGxpbmsgQ2xlYW51cE1vZGUjV0hJVEVTUEFDRX0KKwkgKiBAcmV0dXJuIHRoZSB7QGNvZGUgbW9kZX0sIGlmIGl0IGlzIG5vdCB7QGxpbmsgQ2xlYW51cE1vZGUjREVGQVVMVH0sCisJICogICAgICAgICBvdGhlcndpc2UgdGhlIHJlc29sdmVkIG1vZGUsIHdoaWNoIGlzIG5ldmVyCisJICogICAgICAgICB7QGxpbmsgQ2xlYW51cE1vZGUjREVGQVVMVH0KKwkgKiBAc2luY2UgNi4xCisJICovCisJQE5vbk51bGwKKwlwdWJsaWMgQ2xlYW51cE1vZGUgcmVzb2x2ZShATm9uTnVsbCBDbGVhbnVwTW9kZSBtb2RlLAorCQkJYm9vbGVhbiBkZWZhdWx0U3RyaXApIHsKKwkJaWYgKENsZWFudXBNb2RlLkRFRkFVTFQgPT0gbW9kZSkgeworCQkJQ2xlYW51cE1vZGUgZGVmYXVsdE1vZGUgPSBnZXRDbGVhbnVwTW9kZSgpOworCQkJaWYgKENsZWFudXBNb2RlLkRFRkFVTFQgPT0gZGVmYXVsdE1vZGUpIHsKKwkJCQlyZXR1cm4gZGVmYXVsdFN0cmlwID8gQ2xlYW51cE1vZGUuU1RSSVAKKwkJCQkJCTogQ2xlYW51cE1vZGUuV0hJVEVTUEFDRTsKKwkJCX0KKwkJCXJldHVybiBkZWZhdWx0TW9kZTsKKwkJfQorCQlyZXR1cm4gbW9kZTsKKwl9CisKKwkvKioKIAkgKiBHZXQgdGhlIGNvbnRlbnQgdG8gdGhlIGNvbW1pdCB0ZW1wbGF0ZSBhcyBkZWZpbmVkIGluCiAJICoge0Bjb2RlIGNvbW1pdC50ZW1wbGF0ZX0uIElmIG5vIHtAY29kZSBpMThuLmNvbW1pdEVuY29kaW5nfSBpcyBzcGVjaWZpZWQsCiAJICogVVRGLTggZmFsbGJhY2sgaXMgdXNlZC4KQEAgLTEzNSw0ICsyMzMsODYgQEAgcHJpdmF0ZSBDaGFyc2V0IGdldEVuY29kaW5nKCkgdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCiAJCXJldHVybiBjb21taXRNZXNzYWdlRW5jb2Rpbmc7CiAJfQorCisJLyoqCisJICogUHJvY2Vzc2VzIGEgdGV4dCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHtAbGluayBDbGVhbnVwTW9kZX0uCisJICoKKwkgKiBAcGFyYW0gdGV4dAorCSAqICAgICAgICAgICAgdGV4dCB0byBwcm9jZXNzCisJICogQHBhcmFtIG1vZGUKKwkgKiAgICAgICAgICAgIHtAbGluayBDbGVhbnVwTW9kZX0gdG8gdXNlCisJICogQHBhcmFtIGNvbW1lbnRDaGFyCisJICogICAgICAgICAgICBjb21tZW50IGNoYXJhY3RlciAobm9ybWFsbHkge0Bjb2RlICN9KSB0byB1c2UgaWYge0Bjb2RlIG1vZGV9CisJICogICAgICAgICAgICBpcyB7QGxpbmsgQ2xlYW51cE1vZGUjU1RSSVB9IG9yIHtAbGluayBDbGVhbnVwTW9kZSNTQ0lTU09SU30KKwkgKiBAcmV0dXJuIHRoZSBwcm9jZXNzZWQgdGV4dAorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYge0Bjb2RlIG1vZGV9IGlzIHtAbGluayBDbGVhbnVwTW9kZSNERUZBVUxUfSAodXNlCisJICogICAgICAgICAgICAge0BsaW5rICNyZXNvbHZlKENsZWFudXBNb2RlLCBib29sZWFuKX0gZmlyc3QpCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFuVGV4dChATm9uTnVsbCBTdHJpbmcgdGV4dCwKKwkJCUBOb25OdWxsIENsZWFudXBNb2RlIG1vZGUsIGNoYXIgY29tbWVudENoYXIpIHsKKwkJU3RyaW5nIHRvUHJvY2VzcyA9IHRleHQ7CisJCWJvb2xlYW4gc3RyaXAgPSBmYWxzZTsKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgVkVSQkFUSU06CisJCQlyZXR1cm4gdGV4dDsKKwkJY2FzZSBTQ0lTU09SUzoKKwkJCVN0cmluZyBjdXQgPSBjb21tZW50Q2hhciArIENVVDsKKwkJCWlmICh0ZXh0LnN0YXJ0c1dpdGgoY3V0KSkgeworCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJaW50IGN1dFBvcyA9IHRleHQuaW5kZXhPZignXG4nICsgY3V0KTsKKwkJCWlmIChjdXRQb3MgPj0gMCkgeworCQkJCXRvUHJvY2VzcyA9IHRleHQuc3Vic3RyaW5nKDAsIGN1dFBvcyArIDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RSSVA6CisJCQlzdHJpcCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBXSElURVNQQUNFOgorCQkJYnJlYWs7CisJCWNhc2UgREVGQVVMVDoKKwkJZGVmYXVsdDoKKwkJCS8vIEludGVybmFsIGVycm9yOyBubyB0cmFuc2xhdGlvbgorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjbGVhbi11cCBtb2RlICIgKyBtb2RlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCS8vIFdISVRFU1BBQ0UKKwkJU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlib29sZWFuIGxhc3RXYXNFbXB0eSA9IHRydWU7CisJCWZvciAoU3RyaW5nIGxpbmUgOiB0b1Byb2Nlc3Muc3BsaXQoIlxuIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJbGluZSA9IGxpbmUuc3RyaXBUcmFpbGluZygpOworCQkJaWYgKGxpbmUuaXNFbXB0eSgpKSB7CisJCQkJaWYgKCFsYXN0V2FzRW1wdHkpIHsKKwkJCQkJcmVzdWx0LmFwcGVuZCgnXG4nKTsKKwkJCQkJbGFzdFdhc0VtcHR5ID0gdHJ1ZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCFzdHJpcCB8fCAhaXNDb21tZW50KGxpbmUsIGNvbW1lbnRDaGFyKSkgeworCQkJCWxhc3RXYXNFbXB0eSA9IGZhbHNlOworCQkJCXJlc3VsdC5hcHBlbmQobGluZSkuYXBwZW5kKCdcbicpOworCQkJfQorCQl9CisJCWludCBidWZmZXJTaXplID0gcmVzdWx0Lmxlbmd0aCgpOworCQlpZiAobGFzdFdhc0VtcHR5ICYmIGJ1ZmZlclNpemUgPiAwKSB7CisJCQlidWZmZXJTaXplLS07CisJCQlyZXN1bHQuc2V0TGVuZ3RoKGJ1ZmZlclNpemUpOworCQl9CisJCWlmIChidWZmZXJTaXplID4gMCAmJiAhdG9Qcm9jZXNzLmVuZHNXaXRoKCJcbiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChyZXN1bHQuY2hhckF0KGJ1ZmZlclNpemUgLSAxKSA9PSAnXG4nKSB7CisJCQkJcmVzdWx0LnNldExlbmd0aChidWZmZXJTaXplIC0gMSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb21tZW50KFN0cmluZyB0ZXh0LCBjaGFyIGNvbW1lbnRDaGFyKSB7CisJCWludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQljaGFyIGNoID0gdGV4dC5jaGFyQXQoaSk7CisJCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKSB7CisJCQkJcmV0dXJuIGNoID09IGNvbW1lbnRDaGFyOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YQppbmRleCAxY2UzZTMxLi5kMWQ2NmQyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YQpAQCAtMjc4LDYgKzI3OCw1NCBAQCBwdWJsaWMgaW50IGdldEludChmaW5hbCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sCiAJfQogCiAJLyoqCisJICogT2J0YWluIGFuIGludGVnZXIgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiB3aGljaCBtdXN0IGJlIGluc2lkZSBnaXZlbgorCSAqIHJhbmdlLgorCSAqCisJICogQHBhcmFtIHNlY3Rpb24KKwkgKiAgICAgICAgICAgIHNlY3Rpb24gdGhlIGtleSBpcyBncm91cGVkIHdpdGhpbi4KKwkgKiBAcGFyYW0gbmFtZQorCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUga2V5IHRvIGdldC4KKwkgKiBAcGFyYW0gbWluVmFsdWUKKwkgKiAgICAgICAgICAgIG1pbmltdW0gdmFsdWUKKwkgKiBAcGFyYW0gbWF4VmFsdWUKKwkgKiAgICAgICAgICAgIG1heGltdW0gdmFsdWUKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisJICogICAgICAgICAgICBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiBubyB2YWx1ZSB3YXMgcHJlc2VudC4KKwkgKiBAcmV0dXJuIGFuIGludGVnZXIgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiwgb3IgZGVmYXVsdFZhbHVlLgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgaW50IGdldEludEluUmFuZ2UoU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBuYW1lLCBpbnQgbWluVmFsdWUsCisJCQlpbnQgbWF4VmFsdWUsIGludCBkZWZhdWx0VmFsdWUpIHsKKwkJcmV0dXJuIHR5cGVkR2V0dGVyLmdldEludEluUmFuZ2UodGhpcywgc2VjdGlvbiwgbnVsbCwgbmFtZSwgbWluVmFsdWUsCisJCQkJbWF4VmFsdWUsIGRlZmF1bHRWYWx1ZSk7CisJfQorCisJLyoqCisJICogT2J0YWluIGFuIGludGVnZXIgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiB3aGljaCBtdXN0IGJlIGluc2lkZSBnaXZlbgorCSAqIHJhbmdlLgorCSAqCisJICogQHBhcmFtIHNlY3Rpb24KKwkgKiAgICAgICAgICAgIHNlY3Rpb24gdGhlIGtleSBpcyBncm91cGVkIHdpdGhpbi4KKwkgKiBAcGFyYW0gc3Vic2VjdGlvbgorCSAqICAgICAgICAgICAgc3Vic2VjdGlvbiBuYW1lLCBzdWNoIGEgcmVtb3RlIG9yIGJyYW5jaCBuYW1lLgorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBrZXkgdG8gZ2V0LgorCSAqIEBwYXJhbSBtaW5WYWx1ZQorCSAqICAgICAgICAgICAgbWluaW11bSB2YWx1ZQorCSAqIEBwYXJhbSBtYXhWYWx1ZQorCSAqICAgICAgICAgICAgbWF4aW11bSB2YWx1ZQorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKwkgKiAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIG5vIHZhbHVlIHdhcyBwcmVzZW50LgorCSAqIEByZXR1cm4gYW4gaW50ZWdlciB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLCBvciBkZWZhdWx0VmFsdWUuCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBpbnQgZ2V0SW50SW5SYW5nZShTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sIFN0cmluZyBuYW1lLAorCQkJaW50IG1pblZhbHVlLCBpbnQgbWF4VmFsdWUsIGludCBkZWZhdWx0VmFsdWUpIHsKKwkJcmV0dXJuIHR5cGVkR2V0dGVyLmdldEludEluUmFuZ2UodGhpcywgc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSwKKwkJCQltaW5WYWx1ZSwgbWF4VmFsdWUsIGRlZmF1bHRWYWx1ZSk7CisJfQorCisJLyoqCiAJICogT2J0YWluIGFuIGludGVnZXIgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4KIAkgKgogCSAqIEBwYXJhbSBzZWN0aW9uCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdDb25zdGFudHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0NvbnN0YW50cy5qYXZhCmluZGV4IDYwNWI0NGIuLjJkODM1NDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0NvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0NvbnN0YW50cy5qYXZhCkBAIC0xLDcgKzEsOCBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAxMCwgTWF0aGlhcyBLaW56bGVyIDxtYXRoaWFzLmtpbnpsZXJAc2FwLmNvbT4KICAqIENvcHlyaWdodCAoQykgMjAxMCwgQ2hyaXMgQW5pc3pjenlrIDxjYW5pc3pjenlrQGdtYWlsLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAxMiwgMjAyMCwgUm9iaW4gUm9zZW5iZXJnIGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDEzLCBSb2JpbiBSb3NlbmJlcmcKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIxLCBBbmRyZSBCb3NzZXJ0IDxhbmRyZS5ib3NzZXJ0QHNpZW1lbnMuY29tPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0yOSw2ICszMCw0OCBAQCBwdWJsaWMgZmluYWwgY2xhc3MgQ29uZmlnQ29uc3RhbnRzIHsKIAkvKiogVGhlICJkaWZmIiBzZWN0aW9uICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0RJRkZfU0VDVElPTiA9ICJkaWZmIjsKIAorCS8qKgorCSAqIFRoZSAidG9vbCIga2V5IHdpdGhpbiAiZGlmZiIgc2VjdGlvbgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfVE9PTCA9ICJ0b29sIjsKKworCS8qKgorCSAqIFRoZSAiZ3VpdG9vbCIga2V5IHdpdGhpbiAiZGlmZiIgc2VjdGlvbgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfR1VJVE9PTCA9ICJndWl0b29sIjsKKworCS8qKgorCSAqIFRoZSAiZGlmZnRvb2wiIHNlY3Rpb24KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRElGRlRPT0xfU0VDVElPTiA9ICJkaWZmdG9vbCI7CisKKwkvKioKKwkgKiBUaGUgInByb21wdCIga2V5IHdpdGhpbiAiZGlmZnRvb2wiIHNlY3Rpb24KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX1BST01QVCA9ICJwcm9tcHQiOworCisJLyoqCisJICogVGhlICJ0cnVzdEV4aXRDb2RlIiBrZXkgd2l0aGluICJkaWZmdG9vbCIgc2VjdGlvbgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfVFJVU1RfRVhJVF9DT0RFID0gInRydXN0RXhpdENvZGUiOworCisJLyoqCisJICogVGhlICJjbWQiIGtleSB3aXRoaW4gImRpZmZ0b29sLiouIiBzZWN0aW9uCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9DTUQgPSAiY21kIjsKKwogCS8qKiBUaGUgImRmcyIgc2VjdGlvbiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19ERlNfU0VDVElPTiA9ICJkZnMiOwogCkBAIC0xNDUsNiArMTg4LDEzIEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25maWdDb25zdGFudHMgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19UQUdfU0VDVElPTiA9ICJ0YWciOwogCiAJLyoqCisJICogVGhlICJjbGVhbnVwIiBrZXkKKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX0NMRUFOVVAgPSAiY2xlYW51cCI7CisKKwkvKioKIAkgKiBUaGUgImdwZ1NpZ24iIGtleQogCSAqCiAJICogQHNpbmNlIDUuMgpAQCAtMjg1LDYgKzMzNSwyMCBAQCBwdWJsaWMgZmluYWwgY2xhc3MgQ29uZmlnQ29uc3RhbnRzIHsKIAkvKiogVGhlICJyZW1vdGUiIGtleSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfUkVNT1RFID0gInJlbW90ZSI7CiAKKwkvKioKKwkgKiBUaGUgInB1c2hSZW1vdGUiIGtleS4KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX1BVU0hfUkVNT1RFID0gInB1c2hSZW1vdGUiOworCisJLyoqCisJICogVGhlICJwdXNoRGVmYXVsdCIga2V5LgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfUFVTSF9ERUZBVUxUID0gInB1c2hEZWZhdWx0IjsKKwogCS8qKiBUaGUgIm1lcmdlIiBrZXkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX01FUkdFID0gIm1lcmdlIjsKIApAQCAtNzkxLDYgKzg1NSwzNCBAQCBwdWJsaWMgZmluYWwgY2xhc3MgQ29uZmlnQ29uc3RhbnRzIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX1NFQVJDSF9GT1JfUkVVU0VfVElNRU9VVCA9ICJzZWFyY2hmb3JyZXVzZXRpbWVvdXQiOwogCiAJLyoqCisJICogVGhlICJwdXNoIiBzZWN0aW9uLgorCSAqCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19QVVNIX1NFQ1RJT04gPSAicHVzaCI7CisKKwkvKioKKwkgKiBUaGUgImRlZmF1bHQiIGtleS4KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX0RFRkFVTFQgPSAiZGVmYXVsdCI7CisKKwkvKioKKwkgKiBUaGUgImFiYnJldiIga2V5CisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0tFWV9BQkJSRVYgPSAiYWJicmV2IjsKKworCS8qKgorCSAqIFRoZSAidHJ1c3RQYWNrZWRSZWZzU3RhdCIga2V5CisJICoKKwkgKiBAc2luY2UgNi4xLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfS0VZX1RSVVNUX1BBQ0tFRF9SRUZTX1NUQVQgPSAidHJ1c3RQYWNrZWRSZWZzU3RhdCI7CisKKwkvKioKIAkgKiBUaGUgInBhY2sucHJlc2VydmVPbGRQYWNrcyIga2V5CiAJICoKIAkgKiBAc2luY2UgNS4xMy4yCkBAIC04MDMsNSArODk1LDQgQEAgcHVibGljIGZpbmFsIGNsYXNzIENvbmZpZ0NvbnN0YW50cyB7CiAJICogQHNpbmNlIDUuMTMuMgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19LRVlfUFJVTkVfUFJFU0VSVkVEID0gInBydW5lcHJlc2VydmVkIjsKLQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YQppbmRleCA5MjM2N2ViLi5jZjJlNjlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YQpAQCAtNDgsNiArNDgsMTUgQEAgcHVibGljIGZpbmFsIGNsYXNzIENvbnN0YW50cyB7CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lEX1NUUklOR19MRU5HVEggPSBPQkpFQ1RfSURfTEVOR1RIICogMjsKIAorCS8qKgorCSAqIFRoZSBoaXN0b3JpYyBsZW5ndGggb2YgYW4gYWJicmV2aWF0ZWQgR2l0IG9iamVjdCBoYXNoIHN0cmluZy4gR2l0IDIuMTEKKwkgKiBjaGFuZ2VkIHRoaXMgc3RhdGljIG51bWJlciB0byBhIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgb25lIHRoYXQgc2NhbGVzCisJICogYXMgdGhlIHJlcG9zaXRvcnkgZ3Jvd3MuCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIID0gNzsKKwogCS8qKiBTcGVjaWFsIG5hbWUgZm9yIHRoZSAiSEVBRCIgc3ltYm9saWMtcmVmLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQUQgPSAiSEVBRCI7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvcmVDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvcmVDb25maWcuamF2YQppbmRleCBmMjNjNmUwLi5mYzgyYTVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db3JlQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29yZUNvbmZpZy5qYXZhCkBAIC0xMTYsNiArMTE2LDI3IEBAIHB1YmxpYyBlbnVtIExvZ1JlZlVwZGF0ZXMgewogCQlBTFdBWVMKIAl9CiAKKwkvKioKKwkgKiBQZXJtaXNzaWJsZSB2YWx1ZXMgZm9yIHtAY29kZSBjb3JlLnRydXN0UGFja2VkUmVmc1N0YXR9LgorCSAqCisJICogQHNpbmNlIDYuMS4xCisJICovCisJcHVibGljIGVudW0gVHJ1c3RQYWNrZWRSZWZzU3RhdCB7CisJCS8qKiBEbyBub3QgdHJ1c3QgZmlsZSBhdHRyaWJ1dGVzIG9mIHRoZSBwYWNrZWQtcmVmcyBmaWxlLiAqLworCQlORVZFUiwKKworCQkvKiogVHJ1c3QgZmlsZSBhdHRyaWJ1dGVzIG9mIHRoZSBwYWNrZWQtcmVmcyBmaWxlLiAqLworCQlBTFdBWVMsCisKKwkJLyoqIE9wZW4gYW5kIGNsb3NlIHRoZSBwYWNrZWQtcmVmcyBmaWxlIHRvIHJlZnJlc2ggaXRzIGZpbGUgYXR0cmlidXRlcworCQkgKiBhbmQgdGhlbiB0cnVzdCBpdC4gKi8KKwkJQUZURVJfT1BFTiwKKworCQkvKioge0Bjb2RlIGNvcmUudHJ1c3RQYWNrZWRSZWZzU3RhdH0gZGVmYXVsdHMgdG8gdGhpcyB3aGVuIGl0IGlzCisJCSAqIG5vdCBzZXQgKi8KKwkJVU5TRVQKKwl9CisKIAlwcml2YXRlIGZpbmFsIGludCBjb21wcmVzc2lvbjsKIAogCXByaXZhdGUgZmluYWwgaW50IHBhY2tJbmRleFZlcnNpb247CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EZWZhdWx0VHlwZWRDb25maWdHZXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0RlZmF1bHRUeXBlZENvbmZpZ0dldHRlci5qYXZhCmluZGV4IDlmOTZiY2UuLjg2NDA5NDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0RlZmF1bHRUeXBlZENvbmZpZ0dldHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0RlZmF1bHRUeXBlZENvbmZpZ0dldHRlci5qYXZhCkBAIC0xMjAsNiArMTIwLDI2IEBAIHB1YmxpYyBpbnQgZ2V0SW50KENvbmZpZyBjb25maWcsIFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCisJcHVibGljIGludCBnZXRJbnRJblJhbmdlKENvbmZpZyBjb25maWcsIFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwKKwkJCVN0cmluZyBuYW1lLCBpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSwgaW50IGRlZmF1bHRWYWx1ZSkgeworCQlpbnQgdmFsID0gZ2V0SW50KGNvbmZpZywgc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSwgZGVmYXVsdFZhbHVlKTsKKwkJaWYgKCh2YWwgPj0gbWluVmFsdWUgJiYgdmFsIDw9IG1heFZhbHVlKSB8fCB2YWwgPT0gVU5TRVRfSU5UKSB7CisJCQlyZXR1cm4gdmFsOworCQl9CisJCWlmIChzdWJzZWN0aW9uID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCUpHaXRUZXh0LmdldCgpLmludGVnZXJWYWx1ZU5vdEluUmFuZ2UsIHNlY3Rpb24sIG5hbWUsCisJCQkJCUludGVnZXIudmFsdWVPZih2YWwpLCBJbnRlZ2VyLnZhbHVlT2YobWluVmFsdWUpLAorCQkJCQlJbnRlZ2VyLnZhbHVlT2YobWF4VmFsdWUpKSk7CisJCX0KKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQlKR2l0VGV4dC5nZXQoKS5pbnRlZ2VyVmFsdWVOb3RJblJhbmdlU3ViU2VjdGlvbiwgc2VjdGlvbiwKKwkJCQlzdWJzZWN0aW9uLCBuYW1lLCBJbnRlZ2VyLnZhbHVlT2YodmFsKSwKKwkJCQlJbnRlZ2VyLnZhbHVlT2YobWluVmFsdWUpLCBJbnRlZ2VyLnZhbHVlT2YobWF4VmFsdWUpKSk7CisJfQorCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgbG9uZyBnZXRMb25nKENvbmZpZyBjb25maWcsIFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwKIAkJCVN0cmluZyBuYW1lLCBsb25nIGRlZmF1bHRWYWx1ZSkgewogCQlmaW5hbCBTdHJpbmcgc3RyID0gY29uZmlnLmdldFN0cmluZyhzZWN0aW9uLCBzdWJzZWN0aW9uLCBuYW1lKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEKaW5kZXggMjhlYTkyNy4uZGY5ZmQ0NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEKQEAgLTU2OCw2ICs1NjgsOSBAQCBwdWJsaWMgYm9vbGVhbiBkaWZmKFByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgZXN0V29ya1RyZWVTaXplLAogCQlpZiAoaWdub3JlU3VibW9kdWxlTW9kZSAhPSBJZ25vcmVTdWJtb2R1bGVNb2RlLkFMTCkgewogCQkJdHJ5IChTdWJtb2R1bGVXYWxrIHNtdyA9IG5ldyBTdWJtb2R1bGVXYWxrKHJlcG9zaXRvcnkpKSB7CiAJCQkJc213LnNldFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IoZGlyQ2FjaGUpKTsKKwkJCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKKwkJCQkJc213LnNldEZpbHRlcihmaWx0ZXIpOworCQkJCX0KIAkJCQlzbXcuc2V0QnVpbGRlckZhY3RvcnkoZmFjdG9yeSk7CiAJCQkJd2hpbGUgKHNtdy5uZXh0KCkpIHsKIAkJCQkJSWdub3JlU3VibW9kdWxlTW9kZSBsb2NhbElnbm9yZVN1Ym1vZHVsZU1vZGUgPSBpZ25vcmVTdWJtb2R1bGVNb2RlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0RGF0YWJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEKaW5kZXggMDQyNjJjMC4uNzAwMDljYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0RGF0YWJhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhCkBAIC0xNTUsNCArMTU1LDE0IEBAIHB1YmxpYyBPYmplY3RMb2FkZXIgb3BlbihBbnlPYmplY3RJZCBvYmplY3RJZCwgaW50IHR5cGVIaW50KQogCXB1YmxpYyBPYmplY3REYXRhYmFzZSBuZXdDYWNoZWREYXRhYmFzZSgpIHsKIAkJcmV0dXJuIHRoaXM7CiAJfQorCisJLyoqCisJICogR2V0IGEgcXVpY2ssIHJvdWdoIGNvdW50IG9mIG9iamVjdHMgaW4gdGhpcyByZXBvc2l0b3J5LiBJZ25vcmVzIGxvb3NlCisJICogb2JqZWN0cy4gUmV0dXJucyB7QGNvZGUgLTF9IGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMuCisJICoKKwkgKiBAcmV0dXJuIHF1aWNrLCByb3VnaCBjb3VudCBvZiBvYmplY3RzIGluIHRoaXMgcmVwb3NpdG9yeSwge0Bjb2RlIC0xfSBpZgorCSAqICAgICAgICAgYW4gZXhjZXB0aW9uIG9jY3VycworCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRBcHByb3hpbWF0ZU9iamVjdENvdW50KCk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RSZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdFJlYWRlci5qYXZhCmluZGV4IGEyYzczODEuLjI2YzNmZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdFJlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdFJlYWRlci5qYXZhCkBAIC0xMCw2ICsxMCw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5saWI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTc2LDcgKzc4LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIE9iamVjdFJlYWRlciBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUgewogCSAqLwogCXB1YmxpYyBBYmJyZXZpYXRlZE9iamVjdElkIGFiYnJldmlhdGUoQW55T2JqZWN0SWQgb2JqZWN0SWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gYWJicmV2aWF0ZShvYmplY3RJZCwgNyk7CisJCXJldHVybiBhYmJyZXZpYXRlKG9iamVjdElkLCBPQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEgpOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50LmphdmEKaW5kZXggNDI4YTZiOS4uOTM3MTAyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9QZXJzb25JZGVudC5qYXZhCkBAIC0xNCw2ICsxNCw4IEBACiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKK2ltcG9ydCBqYXZhLnRpbWUuWm9uZUlkOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwpAQCAtMjA2LDYgKzIwOCwyMCBAQCBwdWJsaWMgUGVyc29uSWRlbnQoUGVyc29uSWRlbnQgcGksIERhdGUgYVdoZW4pIHsKIAl9CiAKIAkvKioKKwkgKiBDb3B5IGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50fSwgYnV0IGFsdGVyIHRoZSBjbG9uZSdzCisJICogdGltZSBzdGFtcAorCSAqCisJICogQHBhcmFtIHBpCisJICogICAgICAgICAgICBvcmlnaW5hbCB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnR9CisJICogQHBhcmFtIGFXaGVuCisJICogICAgICAgICAgICBsb2NhbCB0aW1lIGFzIEluc3RhbnQKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFBlcnNvbklkZW50KFBlcnNvbklkZW50IHBpLCBJbnN0YW50IGFXaGVuKSB7CisJCXRoaXMocGkuZ2V0TmFtZSgpLCBwaS5nZXRFbWFpbEFkZHJlc3MoKSwgYVdoZW4udG9FcG9jaE1pbGxpKCksIHBpLnR6T2Zmc2V0KTsKKwl9CisKKwkvKioKIAkgKiBDb25zdHJ1Y3QgYSBQZXJzb25JZGVudCBmcm9tIHNpbXBsZSBkYXRhCiAJICoKIAkgKiBAcGFyYW0gYU5hbWUgYSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30gb2JqZWN0LgpAQCAtMjIyLDYgKzIzOCwyNyBAQCBwdWJsaWMgUGVyc29uSWRlbnQoZmluYWwgU3RyaW5nIGFOYW1lLCBmaW5hbCBTdHJpbmcgYUVtYWlsQWRkcmVzcywKIAl9CiAKIAkvKioKKwkgKiBDb25zdHJ1Y3QgYSBQZXJzb25JZGVudCBmcm9tIHNpbXBsZSBkYXRhCisJICoKKwkgKiBAcGFyYW0gYU5hbWUKKwkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KKwkgKiBAcGFyYW0gYUVtYWlsQWRkcmVzcworCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30gb2JqZWN0LgorCSAqIEBwYXJhbSBhV2hlbgorCSAqICAgICAgICAgICAgbG9jYWwgdGltZSBzdGFtcAorCSAqIEBwYXJhbSB6b25lSWQKKwkgKiAgICAgICAgICAgIHRpbWUgem9uZSBpZAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgUGVyc29uSWRlbnQoZmluYWwgU3RyaW5nIGFOYW1lLCBTdHJpbmcgYUVtYWlsQWRkcmVzcywgSW5zdGFudCBhV2hlbiwKKwkJCVpvbmVJZCB6b25lSWQpIHsKKwkJdGhpcyhhTmFtZSwgYUVtYWlsQWRkcmVzcywgYVdoZW4udG9FcG9jaE1pbGxpKCksCisJCQkJVGltZVpvbmUuZ2V0VGltZVpvbmUoem9uZUlkKQorCQkJCQkJLmdldE9mZnNldChhV2hlbgorCQkJCS50b0Vwb2NoTWlsbGkoKSkgLyAoNjAgKiAxMDAwKSk7CisJfQorCisJLyoqCiAJICogQ29weSBhIFBlcnNvbklkZW50LCBidXQgYWx0ZXIgdGhlIGNsb25lJ3MgdGltZSBzdGFtcAogCSAqCiAJICogQHBhcmFtIHBpCkBAIC0zMDQsNiArMzQxLDE2IEBAIHB1YmxpYyBEYXRlIGdldFdoZW4oKSB7CiAJfQogCiAJLyoqCisJICogR2V0IHdoZW4gYXR0cmlidXRlIGFzIGluc3RhbnQKKwkgKgorCSAqIEByZXR1cm4gdGltZXN0YW1wCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBJbnN0YW50IGdldFdoZW5Bc0luc3RhbnQoKSB7CisJCXJldHVybiBJbnN0YW50Lm9mRXBvY2hNaWxsaSh3aGVuKTsKKwl9CisKKwkvKioKIAkgKiBHZXQgdGhpcyBwZXJzb24ncyBkZWNsYXJlZCB0aW1lIHpvbmUKIAkgKgogCSAqIEByZXR1cm4gdGhpcyBwZXJzb24ncyBkZWNsYXJlZCB0aW1lIHpvbmU7IG51bGwgaWYgdGltZSB6b25lIGlzIHVua25vd24uCkBAIC0zMTMsNiArMzYwLDE2IEBAIHB1YmxpYyBUaW1lWm9uZSBnZXRUaW1lWm9uZSgpIHsKIAl9CiAKIAkvKioKKwkgKiBHZXQgdGhlIHRpbWUgem9uZSBpZAorCSAqCisJICogQHJldHVybiB0aGUgdGltZSB6b25lIGlkCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBab25lSWQgZ2V0Wm9uZUlkKCkgeworCQlyZXR1cm4gZ2V0VGltZVpvbmUoKS50b1pvbmVJZCgpOworCX0KKworCS8qKgogCSAqIEdldCB0aGlzIHBlcnNvbidzIGRlY2xhcmVkIHRpbWUgem9uZSBhcyBtaW51dGVzIGVhc3Qgb2YgVVRDLgogCSAqCiAJICogQHJldHVybiB0aGlzIHBlcnNvbidzIGRlY2xhcmVkIHRpbWUgem9uZSBhcyBtaW51dGVzIGVhc3Qgb2YgVVRDLiBJZiB0aGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1R5cGVkQ29uZmlnR2V0dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UeXBlZENvbmZpZ0dldHRlci5qYXZhCmluZGV4IDBmMmY2Y2YuLmM0ZWI4ZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1R5cGVkQ29uZmlnR2V0dGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVHlwZWRDb25maWdHZXR0ZXIuamF2YQpAQCAtMjksNiArMjksMTMgQEAKIHB1YmxpYyBpbnRlcmZhY2UgVHlwZWRDb25maWdHZXR0ZXIgewogCiAJLyoqCisJICogVXNlIHtAY29kZSBJbnRlZ2VyI01JTl9WQUxVRX0gYXMgdW5zZXQgaW50IHZhbHVlCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRVRfSU5UID0gSW50ZWdlci5NSU5fVkFMVUU7CisKKwkvKioKIAkgKiBHZXQgYSBib29sZWFuIHZhbHVlIGZyb20gYSBnaXQge0BsaW5rIENvbmZpZ30uCiAJICoKIAkgKiBAcGFyYW0gY29uZmlnCkBAIC04Nyw2ICs5NCwzMiBAQCBpbnQgZ2V0SW50KENvbmZpZyBjb25maWcsIFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwgU3RyaW5nIG5hbWUsCiAJCQlpbnQgZGVmYXVsdFZhbHVlKTsKIAogCS8qKgorCSAqIE9idGFpbiBhbiBpbnRlZ2VyIHZhbHVlIGZyb20gYSBnaXQge0BsaW5rIENvbmZpZ30gd2hpY2ggbXVzdCBiZSBpbiBnaXZlbgorCSAqIHJhbmdlLgorCSAqCisJICogQHBhcmFtIGNvbmZpZworCSAqICAgICAgICAgICAgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tCisJICogQHBhcmFtIHNlY3Rpb24KKwkgKiAgICAgICAgICAgIHNlY3Rpb24gdGhlIGtleSBpcyBncm91cGVkIHdpdGhpbi4KKwkgKiBAcGFyYW0gc3Vic2VjdGlvbgorCSAqICAgICAgICAgICAgc3Vic2VjdGlvbiBuYW1lLCBzdWNoIGEgcmVtb3RlIG9yIGJyYW5jaCBuYW1lLgorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBrZXkgdG8gZ2V0LgorCSAqIEBwYXJhbSBtaW5WYWx1ZQorCSAqICAgICAgICAgICAgbWluaW1hbCB2YWx1ZQorCSAqIEBwYXJhbSBtYXhWYWx1ZQorCSAqICAgICAgICAgICAgbWF4aW11bSB2YWx1ZQorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKKwkgKiAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIG5vIHZhbHVlIHdhcyBwcmVzZW50LiBVc2UKKwkgKiAgICAgICAgICAgIHtAY29kZSAjVU5TRVRfSU5UfSB0byBzZXQgdGhlIGRlZmF1bHQgdG8gdW5zZXQuCisJICogQHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sIG9yIGRlZmF1bHRWYWx1ZS4KKwkgKiAgICAgICAgIHtAY29kZSAjVU5TRVRfSU5UfSBpZiB1bnNldC4KKwkgKiBAc2luY2UgNi4xCisJICovCisJaW50IGdldEludEluUmFuZ2UoQ29uZmlnIGNvbmZpZywgU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBzdWJzZWN0aW9uLAorCQkJU3RyaW5nIG5hbWUsIGludCBtaW5WYWx1ZSwgaW50IG1heFZhbHVlLCBpbnQgZGVmYXVsdFZhbHVlKTsKKworCS8qKgogCSAqIE9idGFpbiBhIGxvbmcgdmFsdWUgZnJvbSBhIGdpdCB7QGxpbmsgQ29uZmlnfS4KIAkgKgogCSAqIEBwYXJhbSBjb25maWcKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL2ludGVybmFsL0Jvb2xlYW5UcmlTdGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvaW50ZXJuYWwvQm9vbGVhblRyaVN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkM2JiMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL2ludGVybmFsL0Jvb2xlYW5UcmlTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgU2ltZW9uIEFuZHJlZXYgPHNpbWVvbi5kYW5haWxvdi5hbmRyZWV2QGdtYWlsLmNvbT4gYW5kIG90aGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWw7CisKKy8qKgorICogQSBib29sZWFuIHZhbHVlIHRoYXQgY2FuIGFsc28gaGF2ZSBhbiB1bnNldCBzdGF0ZS4KKyAqLworcHVibGljIGVudW0gQm9vbGVhblRyaVN0YXRlIHsKKwkvKioKKwkgKiBWYWx1ZSBlcXVpdmFsZW50IHRvIHtAY29kZSB0cnVlfS4KKwkgKi8KKwlUUlVFLAorCS8qKgorCSAqIFZhbHVlIGVxdWl2YWxlbnQgdG8ge0Bjb2RlIGZhbHNlfS4KKwkgKi8KKwlGQUxTRSwKKwkvKioKKwkgKiBWYWx1ZSBpcyBub3Qgc2V0LgorCSAqLworCVVOU0VUOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZU1lc3NhZ2VGb3JtYXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VNZXNzYWdlRm9ybWF0dGVyLmphdmEKaW5kZXggZjc5NjZhMi4uZTBjMDgzZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZU1lc3NhZ2VGb3JtYXR0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlTWVzc2FnZUZvcm1hdHRlci5qYXZhCkBAIC05MiwzNiArOTIsNjIgQEAgcHVibGljIFN0cmluZyBmb3JtYXQoTGlzdDxSZWY+IHJlZnNUb01lcmdlLCBSZWYgdGFyZ2V0KSB7CiAJfQogCiAJLyoqCi0JICogQWRkIHNlY3Rpb24gd2l0aCBjb25mbGljdGluZyBwYXRocyB0byBtZXJnZSBtZXNzYWdlLgorCSAqIEFkZCBzZWN0aW9uIHdpdGggY29uZmxpY3RpbmcgcGF0aHMgdG8gbWVyZ2UgbWVzc2FnZS4gTGluZXMgYXJlIHByZWZpeGVkCisJICogd2l0aCBhIGhhc2guCiAJICoKIAkgKiBAcGFyYW0gbWVzc2FnZQogCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG1lcmdlIG1lc3NhZ2UKIAkgKiBAcGFyYW0gY29uZmxpY3RpbmdQYXRocwogCSAqICAgICAgICAgICAgdGhlIHBhdGhzIHdpdGggY29uZmxpY3RzCiAJICogQHJldHVybiBtZXJnZSBtZXNzYWdlIHdpdGggY29uZmxpY3RpbmcgcGF0aHMgYWRkZWQKKwkgKiBAZGVwcmVjYXRlZCBzaW5jZSA2LjE7IHVzZQorCSAqICAgICAgICAgICAgIHtAbGluayAjZm9ybWF0V2l0aENvbmZsaWN0cyhTdHJpbmcsIEl0ZXJhYmxlLCBjaGFyKX0gaW5zdGVhZAogCSAqLworCUBEZXByZWNhdGVkCiAJcHVibGljIFN0cmluZyBmb3JtYXRXaXRoQ29uZmxpY3RzKFN0cmluZyBtZXNzYWdlLAogCQkJTGlzdDxTdHJpbmc+IGNvbmZsaWN0aW5nUGF0aHMpIHsKKwkJcmV0dXJuIGZvcm1hdFdpdGhDb25mbGljdHMobWVzc2FnZSwgY29uZmxpY3RpbmdQYXRocywgJyMnKTsKKwl9CisKKwkvKioKKwkgKiBBZGQgc2VjdGlvbiB3aXRoIGNvbmZsaWN0aW5nIHBhdGhzIHRvIG1lcmdlIG1lc3NhZ2UuCisJICoKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG1lcmdlIG1lc3NhZ2UKKwkgKiBAcGFyYW0gY29uZmxpY3RpbmdQYXRocworCSAqICAgICAgICAgICAgdGhlIHBhdGhzIHdpdGggY29uZmxpY3RzCisJICogQHBhcmFtIGNvbW1lbnRDaGFyCisJICogICAgICAgICAgICBjb21tZW50IGNoYXJhY3RlciB0byB1c2UgZm9yIHByZWZpeGluZyB0aGUgY29uZmxpY3QgbGluZXMKKwkgKiBAcmV0dXJuIG1lcmdlIG1lc3NhZ2Ugd2l0aCBjb25mbGljdGluZyBwYXRocyBhZGRlZAorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGZvcm1hdFdpdGhDb25mbGljdHMoU3RyaW5nIG1lc3NhZ2UsCisJCQlJdGVyYWJsZTxTdHJpbmc+IGNvbmZsaWN0aW5nUGF0aHMsIGNoYXIgY29tbWVudENoYXIpIHsKIAkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCVN0cmluZ1tdIGxpbmVzID0gbWVzc2FnZS5zcGxpdCgiXG4iKTsgLy8kTk9OLU5MUy0xJAogCQlpbnQgZmlyc3RGb290ZXJMaW5lID0gQ2hhbmdlSWRVdGlsLmluZGV4T2ZGaXJzdEZvb3RlckxpbmUobGluZXMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpcnN0Rm9vdGVyTGluZTsgaSsrKQorCQlmb3IgKGludCBpID0gMDsgaSA8IGZpcnN0Rm9vdGVyTGluZTsgaSsrKSB7CiAJCQlzYi5hcHBlbmQobGluZXNbaV0pLmFwcGVuZCgnXG4nKTsKLQkJaWYgKGZpcnN0Rm9vdGVyTGluZSA9PSBsaW5lcy5sZW5ndGggJiYgbWVzc2FnZS5sZW5ndGgoKSAhPSAwKQorCQl9CisJCWlmIChmaXJzdEZvb3RlckxpbmUgPT0gbGluZXMubGVuZ3RoICYmIG1lc3NhZ2UubGVuZ3RoKCkgIT0gMCkgewogCQkJc2IuYXBwZW5kKCdcbicpOwotCQlhZGRDb25mbGljdHNNZXNzYWdlKGNvbmZsaWN0aW5nUGF0aHMsIHNiKTsKLQkJaWYgKGZpcnN0Rm9vdGVyTGluZSA8IGxpbmVzLmxlbmd0aCkKKwkJfQorCQlhZGRDb25mbGljdHNNZXNzYWdlKGNvbmZsaWN0aW5nUGF0aHMsIHNiLCBjb21tZW50Q2hhcik7CisJCWlmIChmaXJzdEZvb3RlckxpbmUgPCBsaW5lcy5sZW5ndGgpIHsKIAkJCXNiLmFwcGVuZCgnXG4nKTsKLQkJZm9yIChpbnQgaSA9IGZpcnN0Rm9vdGVyTGluZTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKQorCQl9CisJCWZvciAoaW50IGkgPSBmaXJzdEZvb3RlckxpbmU7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewogCQkJc2IuYXBwZW5kKGxpbmVzW2ldKS5hcHBlbmQoJ1xuJyk7CisJCX0KIAkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDb25mbGljdHNNZXNzYWdlKExpc3Q8U3RyaW5nPiBjb25mbGljdGluZ1BhdGhzLAotCQkJU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoIkNvbmZsaWN0czpcbiIpOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDb25mbGljdHNNZXNzYWdlKEl0ZXJhYmxlPFN0cmluZz4gY29uZmxpY3RpbmdQYXRocywKKwkJCVN0cmluZ0J1aWxkZXIgc2IsIGNoYXIgY29tbWVudENoYXIpIHsKKwkJc2IuYXBwZW5kKGNvbW1lbnRDaGFyKS5hcHBlbmQoIiBDb25mbGljdHM6XG4iKTsgLy8kTk9OLU5MUy0xJAogCQlmb3IgKFN0cmluZyBjb25mbGljdGluZ1BhdGggOiBjb25mbGljdGluZ1BhdGhzKSB7Ci0JCQlzYi5hcHBlbmQoJ1x0JykuYXBwZW5kKGNvbmZsaWN0aW5nUGF0aCkuYXBwZW5kKCdcbicpOworCQkJc2IuYXBwZW5kKGNvbW1lbnRDaGFyKS5hcHBlbmQoJ1x0JykuYXBwZW5kKGNvbmZsaWN0aW5nUGF0aCkKKwkJCQkJLmFwcGVuZCgnXG4nKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXIuamF2YQppbmRleCA3NzY3NjYyLi5iOWFiMWQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXIuamF2YQpAQCAtMyw3ICszLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAxMC0yMDEyLCBNYXR0aGlhcyBTb2huIDxtYXR0aGlhcy5zb2huQHNhcC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMTIsIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTcsIE9iZW8gKG1hdGhpZXUuY2FydGF1ZEBvYmVvLmZyKQotICogQ29weXJpZ2h0IChDKSAyMDE4LCBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDE4LCAyMDIyIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0yNzYsMTEgKzI3NiwxNSBAQCBwdWJsaWMgZW51bSBNZXJnZUZhaWx1cmVSZWFzb24gewogCXByaXZhdGUgQ29udGVudE1lcmdlU3RyYXRlZ3kgY29udGVudFN0cmF0ZWd5ID0gQ29udGVudE1lcmdlU3RyYXRlZ3kuQ09ORkxJQ1Q7CiAKIAkvKioKLQkgKiBLZWVwcyB7QGxpbmsgQ2hlY2tvdXRNZXRhZGF0YX0gZm9yIHtAbGluayAjY2hlY2tvdXQoKX0gYW5kCi0JICoge0BsaW5rICNjbGVhblVwKCl9LgorCSAqIEtlZXBzIHtAbGluayBDaGVja291dE1ldGFkYXRhfSBmb3Ige0BsaW5rICNjaGVja291dCgpfS4KIAkgKi8KIAlwcml2YXRlIE1hcDxTdHJpbmcsIENoZWNrb3V0TWV0YWRhdGE+IGNoZWNrb3V0TWV0YWRhdGE7CiAKKwkvKioKKwkgKiBLZWVwcyB7QGxpbmsgQ2hlY2tvdXRNZXRhZGF0YX0gZm9yIHtAbGluayAjY2xlYW5VcCgpfS4KKwkgKi8KKwlwcml2YXRlIE1hcDxTdHJpbmcsIENoZWNrb3V0TWV0YWRhdGE+IGNsZWFudXBNZXRhZGF0YTsKKwogCXByaXZhdGUgc3RhdGljIE1lcmdlQWxnb3JpdGhtIGdldE1lcmdlQWxnb3JpdGhtKENvbmZpZyBjb25maWcpIHsKIAkJU3VwcG9ydGVkQWxnb3JpdGhtIGRpZmZBbGcgPSBjb25maWcuZ2V0RW51bSgKIAkJCQlDT05GSUdfRElGRl9TRUNUSU9OLCBudWxsLCBDT05GSUdfS0VZX0FMR09SSVRITSwKQEAgLTM4MywxMiArMzg3LDE0IEBAIHByb3RlY3RlZCBib29sZWFuIG1lcmdlSW1wbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAkJaWYgKCFpbkNvcmUpIHsKIAkJCWNoZWNrb3V0TWV0YWRhdGEgPSBuZXcgSGFzaE1hcDw+KCk7CisJCQljbGVhbnVwTWV0YWRhdGEgPSBuZXcgSGFzaE1hcDw+KCk7CiAJCX0KIAkJdHJ5IHsKIAkJCXJldHVybiBtZXJnZVRyZWVzKG1lcmdlQmFzZSgpLCBzb3VyY2VUcmVlc1swXSwgc291cmNlVHJlZXNbMV0sCiAJCQkJCWZhbHNlKTsKIAkJfSBmaW5hbGx5IHsKIAkJCWNoZWNrb3V0TWV0YWRhdGEgPSBudWxsOworCQkJY2xlYW51cE1ldGFkYXRhID0gbnVsbDsKIAkJCWlmIChpbXBsaWNpdERpckNhY2hlKSB7CiAJCQkJZGlyY2FjaGUudW5sb2NrKCk7CiAJCQl9CkBAIC00NDcsNyArNDUzLDcgQEAgcHJvdGVjdGVkIHZvaWQgY2xlYW5VcCgpIHRocm93cyBOb1dvcmtUcmVlRXhjZXB0aW9uLAogCQkJRGlyQ2FjaGVFbnRyeSBlbnRyeSA9IGRjLmdldEVudHJ5KG1wYXRoKTsKIAkJCWlmIChlbnRyeSAhPSBudWxsKSB7CiAJCQkJRGlyQ2FjaGVDaGVja291dC5jaGVja291dEVudHJ5KGRiLCBlbnRyeSwgcmVhZGVyLCBmYWxzZSwKLQkJCQkJCWNoZWNrb3V0TWV0YWRhdGEuZ2V0KG1wYXRoKSk7CisJCQkJCQljbGVhbnVwTWV0YWRhdGEuZ2V0KG1wYXRoKSk7CiAJCQl9CiAJCQltcGF0aHNJdC5yZW1vdmUoKTsKIAkJfQpAQCAtNTAxLDIyICs1MDcsMjYgQEAgcHJpdmF0ZSBEaXJDYWNoZUVudHJ5IGtlZXAoRGlyQ2FjaGVFbnRyeSBlKSB7CiAJICogUmVtZW1iZXJzIHRoZSB7QGxpbmsgQ2hlY2tvdXRNZXRhZGF0YX0gZm9yIHRoZSBnaXZlbiBwYXRoOyBpdCBtYXkgYmUKIAkgKiBuZWVkZWQgaW4ge0BsaW5rICNjaGVja291dCgpfSBvciBpbiB7QGxpbmsgI2NsZWFuVXAoKX0uCiAJICoKKwkgKiBAcGFyYW0gbWFwCisJICogICAgICAgICAgICB0byBhZGQgdGhlIG1ldGFkYXRhIHRvCiAJICogQHBhcmFtIHBhdGgKIAkgKiAgICAgICAgICAgIG9mIHRoZSBjdXJyZW50IG5vZGUKIAkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqICAgICAgICAgICAgZm9yIHRoZSBjdXJyZW50IG5vZGUKKwkgKiAgICAgICAgICAgIHRvIHVzZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIG1ldGFkYXRhCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIHRoZSBzbXVkZ2UgZmlsdGVyIGNhbm5vdCBiZSBkZXRlcm1pbmVkCi0JICogQHNpbmNlIDUuMQorCSAqIEBzaW5jZSA2LjEKIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGVja291dE1ldGFkYXRhKFN0cmluZyBwYXRoLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisJcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tvdXRNZXRhZGF0YShNYXA8U3RyaW5nLCBDaGVja291dE1ldGFkYXRhPiBtYXAsCisJCQlTdHJpbmcgcGF0aCwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGNoZWNrb3V0TWV0YWRhdGEgIT0gbnVsbCkgeworCQlpZiAobWFwICE9IG51bGwpIHsKIAkJCUVvbFN0cmVhbVR5cGUgZW9sID0gRW9sU3RyZWFtVHlwZVV0aWwuZGV0ZWN0U3RyZWFtVHlwZSgKLQkJCQkJT3BlcmF0aW9uVHlwZS5DSEVDS09VVF9PUCwgd29ya2luZ1RyZWVPcHRpb25zLCBhdHRyaWJ1dGVzKTsKKwkJCQkJT3BlcmF0aW9uVHlwZS5DSEVDS09VVF9PUCwgd29ya2luZ1RyZWVPcHRpb25zLAorCQkJCQlhdHRyaWJ1dGVzKTsKIAkJCUNoZWNrb3V0TWV0YWRhdGEgZGF0YSA9IG5ldyBDaGVja291dE1ldGFkYXRhKGVvbCwKLQkJCQkJdHcuZ2V0RmlsdGVyQ29tbWFuZChDb25zdGFudHMuQVRUUl9GSUxURVJfVFlQRV9TTVVER0UpKTsKLQkJCWNoZWNrb3V0TWV0YWRhdGEucHV0KHBhdGgsIGRhdGEpOworCQkJCQl0dy5nZXRTbXVkZ2VDb21tYW5kKGF0dHJpYnV0ZXMpKTsKKwkJCW1hcC5wdXQocGF0aCwgZGF0YSk7CiAJCX0KIAl9CiAKQEAgLTUyOSwxNSArNTM5LDE3IEBAIHByb3RlY3RlZCB2b2lkIGFkZENoZWNrb3V0TWV0YWRhdGEoU3RyaW5nIHBhdGgsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKIAkgKiBAcGFyYW0gZW50cnkKIAkgKiAgICAgICAgICAgIHRvIGFkZAogCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0JICogICAgICAgICAgICBmb3IgdGhlIGN1cnJlbnQgZW50cnkKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgQXR0cmlidXRlc30gb2YgdGhlIHRyZWVzCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIHRoZSB7QGxpbmsgQ2hlY2tvdXRNZXRhZGF0YX0gY2Fubm90IGJlIGRldGVybWluZWQKLQkgKiBAc2luY2UgNS4xCisJICogQHNpbmNlIDYuMQogCSAqLwogCXByb3RlY3RlZCB2b2lkIGFkZFRvQ2hlY2tvdXQoU3RyaW5nIHBhdGgsIERpckNhY2hlRW50cnkgZW50cnksCi0JCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQlBdHRyaWJ1dGVzW10gYXR0cmlidXRlcykKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRvQmVDaGVja2VkT3V0LnB1dChwYXRoLCBlbnRyeSk7Ci0JCWFkZENoZWNrb3V0TWV0YWRhdGEocGF0aCwgYXR0cmlidXRlcyk7CisJCWFkZENoZWNrb3V0TWV0YWRhdGEoY2xlYW51cE1ldGFkYXRhLCBwYXRoLCBhdHRyaWJ1dGVzW1RfT1VSU10pOworCQlhZGRDaGVja291dE1ldGFkYXRhKGNoZWNrb3V0TWV0YWRhdGEsIHBhdGgsIGF0dHJpYnV0ZXNbVF9USEVJUlNdKTsKIAl9CiAKIAkvKioKQEAgLTU0OSw3ICs1NjEsNyBAQCBwcm90ZWN0ZWQgdm9pZCBhZGRUb0NoZWNrb3V0KFN0cmluZyBwYXRoLCBEaXJDYWNoZUVudHJ5IGVudHJ5LAogCSAqIEBwYXJhbSBpc0ZpbGUKIAkgKiAgICAgICAgICAgIHdoZXRoZXIgaXQgaXMgYSBmaWxlCiAJICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIGZvciB0aGUgZW50cnkKKwkgKiAgICAgICAgICAgIHRvIHVzZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIHtAbGluayBDaGVja291dE1ldGFkYXRhfQogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiB0aGUge0BsaW5rIENoZWNrb3V0TWV0YWRhdGF9IGNhbm5vdCBiZSBkZXRlcm1pbmVkCiAJICogQHNpbmNlIDUuMQpAQCAtNTU4LDcgKzU3MCw3IEBAIHByb3RlY3RlZCB2b2lkIGFkZERlbGV0aW9uKFN0cmluZyBwYXRoLCBib29sZWFuIGlzRmlsZSwKIAkJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdG9CZURlbGV0ZWQuYWRkKHBhdGgpOwogCQlpZiAoaXNGaWxlKSB7Ci0JCQlhZGRDaGVja291dE1ldGFkYXRhKHBhdGgsIGF0dHJpYnV0ZXMpOworCQkJYWRkQ2hlY2tvdXRNZXRhZGF0YShjbGVhbnVwTWV0YWRhdGEsIHBhdGgsIGF0dHJpYnV0ZXMpOwogCQl9CiAJfQogCkBAIC01OTksNyArNjExLDcgQEAgcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRpb24oU3RyaW5nIHBhdGgsIGJvb2xlYW4gaXNGaWxlLAogCSAqICAgICAgICAgICAgc2VlCiAJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5tZXJnZS5SZXNvbHZlTWVyZ2VyI21lcmdlVHJlZXMoQWJzdHJhY3RUcmVlSXRlcmF0b3IsIFJldlRyZWUsIFJldlRyZWUsIGJvb2xlYW4pfQogCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0JICogICAgICAgICAgICB0aGUgYXR0cmlidXRlcyBkZWZpbmVkIGZvciB0aGlzIGVudHJ5CisJICogICAgICAgICAgICB0aGUge0BsaW5rIEF0dHJpYnV0ZXN9IGZvciB0aGUgdGhyZWUgdHJlZXMKIAkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgbWVyZ2Ugd2lsbCBmYWlsIGJlY2F1c2UgdGhlIGluZGV4IGVudHJ5CiAJICogICAgICAgICBkaWRuJ3QgbWF0Y2ggb3VycyBvciB0aGUgd29ya2luZy1kaXIgZmlsZSB3YXMgZGlydHkgYW5kIGEKIAkgKiAgICAgICAgIGNvbmZsaWN0IG9jY3VycmVkCkBAIC02MDcsMTIgKzYxOSwxMiBAQCBwcm90ZWN0ZWQgdm9pZCBhZGREZWxldGlvbihTdHJpbmcgcGF0aCwgYm9vbGVhbiBpc0ZpbGUsCiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uCiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db3JydXB0T2JqZWN0RXhjZXB0aW9uCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQHNpbmNlIDQuOQorCSAqIEBzaW5jZSA2LjEKIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzRW50cnkoQ2Fub25pY2FsVHJlZVBhcnNlciBiYXNlLAogCQkJQ2Fub25pY2FsVHJlZVBhcnNlciBvdXJzLCBDYW5vbmljYWxUcmVlUGFyc2VyIHRoZWlycywKIAkJCURpckNhY2hlQnVpbGRJdGVyYXRvciBpbmRleCwgV29ya2luZ1RyZWVJdGVyYXRvciB3b3JrLAotCQkJYm9vbGVhbiBpZ25vcmVDb25mbGljdHMsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKKwkJCWJvb2xlYW4gaWdub3JlQ29uZmxpY3RzLCBBdHRyaWJ1dGVzW10gYXR0cmlidXRlcykKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQllbnRlclN1YnRyZWUgPSB0cnVlOwpAQCAtNzI5LDcgKzc0MSw3IEBAIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCiAJCQkJLy8gQmFzZSwgb3VycywgYW5kIHRoZWlycyBhbGwgY29udGFpbiBhIGZvbGRlcjogZG9uJ3QgZGVsZXRlCiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9Ci0JCQlhZGREZWxldGlvbih0dy5nZXRQYXRoU3RyaW5nKCksIG5vblRyZWUobW9kZU8pLCBhdHRyaWJ1dGVzKTsKKwkJCWFkZERlbGV0aW9uKHR3LmdldFBhdGhTdHJpbmcoKSwgbm9uVHJlZShtb2RlTyksIGF0dHJpYnV0ZXNbVF9PVVJTXSk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCkBAIC03NzIsNyArNzg0LDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgYmFzZSwKIAkJaWYgKG5vblRyZWUobW9kZU8pICYmIG5vblRyZWUobW9kZVQpKSB7CiAJCQkvLyBDaGVjayB3b3JrdHJlZSBiZWZvcmUgbW9kaWZ5aW5nIGZpbGVzCiAJCQlib29sZWFuIHdvcmt0cmVlRGlydHkgPSBpc1dvcmt0cmVlRGlydHkod29yaywgb3VyRGNlKTsKLQkJCWlmICghYXR0cmlidXRlcy5jYW5CZUNvbnRlbnRNZXJnZWQoKSAmJiB3b3JrdHJlZURpcnR5KSB7CisJCQlpZiAoIWF0dHJpYnV0ZXNbVF9PVVJTXS5jYW5CZUNvbnRlbnRNZXJnZWQoKSAmJiB3b3JrdHJlZURpcnR5KSB7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCkBAIC03OTEsNyArODAzLDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgYmFzZSwKIAkJCQltZXJnZVJlc3VsdHMucHV0KHR3LmdldFBhdGhTdHJpbmcoKSwgcmVzdWx0KTsKIAkJCQl1bm1lcmdlZFBhdGhzLmFkZCh0dy5nZXRQYXRoU3RyaW5nKCkpOwogCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmICghYXR0cmlidXRlcy5jYW5CZUNvbnRlbnRNZXJnZWQoKSkgeworCQkJfSBlbHNlIGlmICghYXR0cmlidXRlc1tUX09VUlNdLmNhbkJlQ29udGVudE1lcmdlZCgpKSB7CiAJCQkJLy8gRmlsZSBtYXJrZWQgYXMgYmluYXJ5CiAJCQkJc3dpdGNoIChnZXRDb250ZW50TWVyZ2VTdHJhdGVneSgpKSB7CiAJCQkJY2FzZSBPVVJTOgpAQCAtODQyLDEzICs4NTQsMTYgQEAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgYmFzZSwKIAkJCWlmIChpZ25vcmVDb25mbGljdHMpIHsKIAkJCQlyZXN1bHQuc2V0Q29udGFpbnNDb25mbGljdHMoZmFsc2UpOwogCQkJfQotCQkJdXBkYXRlSW5kZXgoYmFzZSwgb3VycywgdGhlaXJzLCByZXN1bHQsIGF0dHJpYnV0ZXMpOworCQkJdXBkYXRlSW5kZXgoYmFzZSwgb3VycywgdGhlaXJzLCByZXN1bHQsIGF0dHJpYnV0ZXNbVF9PVVJTXSk7CiAJCQlTdHJpbmcgY3VycmVudFBhdGggPSB0dy5nZXRQYXRoU3RyaW5nKCk7CiAJCQlpZiAocmVzdWx0LmNvbnRhaW5zQ29uZmxpY3RzKCkgJiYgIWlnbm9yZUNvbmZsaWN0cykgewogCQkJCXVubWVyZ2VkUGF0aHMuYWRkKGN1cnJlbnRQYXRoKTsKIAkJCX0KIAkJCW1vZGlmaWVkRmlsZXMuYWRkKGN1cnJlbnRQYXRoKTsKLQkJCWFkZENoZWNrb3V0TWV0YWRhdGEoY3VycmVudFBhdGgsIGF0dHJpYnV0ZXMpOworCQkJYWRkQ2hlY2tvdXRNZXRhZGF0YShjbGVhbnVwTWV0YWRhdGEsIGN1cnJlbnRQYXRoLAorCQkJCQlhdHRyaWJ1dGVzW1RfT1VSU10pOworCQkJYWRkQ2hlY2tvdXRNZXRhZGF0YShjaGVja291dE1ldGFkYXRhLCBjdXJyZW50UGF0aCwKKwkJCQkJYXR0cmlidXRlc1tUX1RIRUlSU10pOwogCQl9IGVsc2UgaWYgKG1vZGVPICE9IG1vZGVUKSB7CiAJCQkvLyBPVVJTIG9yIFRIRUlSUyBoYXMgYmVlbiBkZWxldGVkCiAJCQlpZiAoKChtb2RlTyAhPSAwICYmICF0dy5pZEVxdWFsKFRfQkFTRSwgVF9PVVJTKSkgfHwgKG1vZGVUICE9IDAgJiYgIXR3CkBAIC04ODEsNyArODk2LDggQEAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgYmFzZSwKIAkJCQkJCS8vIG1hcmtlcnMpLiBCdXQgYWxzbyBzdGFnZSAwIG9mIHRoZSBpbmRleCBpcyBmaWxsZWQKIAkJCQkJCS8vIHdpdGggdGhhdCBjb250ZW50LgogCQkJCQkJcmVzdWx0LnNldENvbnRhaW5zQ29uZmxpY3RzKGZhbHNlKTsKLQkJCQkJCXVwZGF0ZUluZGV4KGJhc2UsIG91cnMsIHRoZWlycywgcmVzdWx0LCBhdHRyaWJ1dGVzKTsKKwkJCQkJCXVwZGF0ZUluZGV4KGJhc2UsIG91cnMsIHRoZWlycywgcmVzdWx0LAorCQkJCQkJCQlhdHRyaWJ1dGVzW1RfT1VSU10pOwogCQkJCQl9IGVsc2UgewogCQkJCQkJYWRkKHR3LmdldFJhd1BhdGgoKSwgYmFzZSwgRGlyQ2FjaGVFbnRyeS5TVEFHRV8xLCBFUE9DSCwKIAkJCQkJCQkJMCk7CkBAIC04OTYsMTEgKzkxMiw5IEBAIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCiAJCQkJCQkJaWYgKGlzV29ya3RyZWVEaXJ0eSh3b3JrLCBvdXJEY2UpKSB7CiAJCQkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJCQl9Ci0JCQkJCQkJaWYgKG5vblRyZWUobW9kZVQpKSB7Ci0JCQkJCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCQkJCWFkZFRvQ2hlY2tvdXQodHcuZ2V0UGF0aFN0cmluZygpLCBlLAotCQkJCQkJCQkJCQlhdHRyaWJ1dGVzKTsKLQkJCQkJCQkJfQorCQkJCQkJCWlmIChub25UcmVlKG1vZGVUKSAmJiBlICE9IG51bGwpIHsKKwkJCQkJCQkJYWRkVG9DaGVja291dCh0dy5nZXRQYXRoU3RyaW5nKCksIGUsCisJCQkJCQkJCQkJYXR0cmlidXRlcyk7CiAJCQkJCQkJfQogCQkJCQkJfQogCkBAIC05NDUsMTQgKzk1OSwxNiBAQCBwcml2YXRlIHN0YXRpYyBNZXJnZVJlc3VsdDxTdWJtb2R1bGVDb25mbGljdD4gY3JlYXRlR2l0TGlua3NNZXJnZVJlc3VsdCgKIAkgKi8KIAlwcml2YXRlIE1lcmdlUmVzdWx0PFJhd1RleHQ+IGNvbnRlbnRNZXJnZShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCiAJCQlDYW5vbmljYWxUcmVlUGFyc2VyIG91cnMsIENhbm9uaWNhbFRyZWVQYXJzZXIgdGhlaXJzLAotCQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBDb250ZW50TWVyZ2VTdHJhdGVneSBzdHJhdGVneSkKKwkJCUF0dHJpYnV0ZXNbXSBhdHRyaWJ1dGVzLCBDb250ZW50TWVyZ2VTdHJhdGVneSBzdHJhdGVneSkKIAkJCXRocm93cyBCaW5hcnlCbG9iRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCS8vIFRXOiBUaGUgYXR0cmlidXRlcyBoZXJlIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgTEZTIHNtdWRnZSBmaWx0ZXIuCisJCS8vIElzIGRvaW5nIGEgY29udGVudCBtZXJnZSBvbiBMRlMgaXRlbXMgcmVhbGx5IGEgZ29vZCBpZGVhPz8KIAkJUmF3VGV4dCBiYXNlVGV4dCA9IGJhc2UgPT0gbnVsbCA/IFJhd1RleHQuRU1QVFlfVEVYVAotCQkJCTogZ2V0UmF3VGV4dChiYXNlLmdldEVudHJ5T2JqZWN0SWQoKSwgYXR0cmlidXRlcyk7CisJCQkJOiBnZXRSYXdUZXh0KGJhc2UuZ2V0RW50cnlPYmplY3RJZCgpLCBhdHRyaWJ1dGVzW1RfQkFTRV0pOwogCQlSYXdUZXh0IG91clRleHQgPSBvdXJzID09IG51bGwgPyBSYXdUZXh0LkVNUFRZX1RFWFQKLQkJCQk6IGdldFJhd1RleHQob3Vycy5nZXRFbnRyeU9iamVjdElkKCksIGF0dHJpYnV0ZXMpOworCQkJCTogZ2V0UmF3VGV4dChvdXJzLmdldEVudHJ5T2JqZWN0SWQoKSwgYXR0cmlidXRlc1tUX09VUlNdKTsKIAkJUmF3VGV4dCB0aGVpcnNUZXh0ID0gdGhlaXJzID09IG51bGwgPyBSYXdUZXh0LkVNUFRZX1RFWFQKLQkJCQk6IGdldFJhd1RleHQodGhlaXJzLmdldEVudHJ5T2JqZWN0SWQoKSwgYXR0cmlidXRlcyk7CisJCQkJOiBnZXRSYXdUZXh0KHRoZWlycy5nZXRFbnRyeU9iamVjdElkKCksIGF0dHJpYnV0ZXNbVF9USEVJUlNdKTsKIAkJbWVyZ2VBbGdvcml0aG0uc2V0Q29udGVudE1lcmdlU3RyYXRlZ3koc3RyYXRlZ3kpOwogCQlyZXR1cm4gbWVyZ2VBbGdvcml0aG0ubWVyZ2UoUmF3VGV4dENvbXBhcmF0b3IuREVGQVVMVCwgYmFzZVRleHQsCiAJCQkJb3VyVGV4dCwgdGhlaXJzVGV4dCk7CkBAIC0xMzQyLDcgKzEzNTgsNyBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBtZXJnZVRyZWVzKEFic3RyYWN0VHJlZUl0ZXJhdG9yIGJhc2VUcmVlLAogCiAJCXR3ID0gbmV3IE5hbWVDb25mbGljdFRyZWVXYWxrKGRiLCByZWFkZXIpOwogCQl0dy5hZGRUcmVlKGJhc2VUcmVlKTsKLQkJdHcuYWRkVHJlZShoZWFkVHJlZSk7CisJCXR3LnNldEhlYWQodHcuYWRkVHJlZShoZWFkVHJlZSkpOwogCQl0dy5hZGRUcmVlKG1lcmdlVHJlZSk7CiAJCWludCBkY2lQb3MgPSB0dy5hZGRUcmVlKGJ1aWxkSXQpOwogCQlpZiAod29ya2luZ1RyZWVJdGVyYXRvciAhPSBudWxsKSB7CkBAIC0xNDAzLDYgKzE0MTksMTMgQEAgcHJvdGVjdGVkIGJvb2xlYW4gbWVyZ2VUcmVlV2FsayhUcmVlV2FsayB0cmVlV2FsaywgYm9vbGVhbiBpZ25vcmVDb25mbGljdHMpCiAJCWJvb2xlYW4gaGFzQXR0cmlidXRlTm9kZVByb3ZpZGVyID0gdHJlZVdhbGsKIAkJCQkuZ2V0QXR0cmlidXRlc05vZGVQcm92aWRlcigpICE9IG51bGw7CiAJCXdoaWxlICh0cmVlV2Fsay5uZXh0KCkpIHsKKwkJCUF0dHJpYnV0ZXNbXSBhdHRyaWJ1dGVzID0geyBOT19BVFRSSUJVVEVTLCBOT19BVFRSSUJVVEVTLAorCQkJCQlOT19BVFRSSUJVVEVTIH07CisJCQlpZiAoaGFzQXR0cmlidXRlTm9kZVByb3ZpZGVyKSB7CisJCQkJYXR0cmlidXRlc1tUX0JBU0VdID0gdHJlZVdhbGsuZ2V0QXR0cmlidXRlcyhUX0JBU0UpOworCQkJCWF0dHJpYnV0ZXNbVF9PVVJTXSA9IHRyZWVXYWxrLmdldEF0dHJpYnV0ZXMoVF9PVVJTKTsKKwkJCQlhdHRyaWJ1dGVzW1RfVEhFSVJTXSA9IHRyZWVXYWxrLmdldEF0dHJpYnV0ZXMoVF9USEVJUlMpOworCQkJfQogCQkJaWYgKCFwcm9jZXNzRW50cnkoCiAJCQkJCXRyZWVXYWxrLmdldFRyZWUoVF9CQVNFLCBDYW5vbmljYWxUcmVlUGFyc2VyLmNsYXNzKSwKIAkJCQkJdHJlZVdhbGsuZ2V0VHJlZShUX09VUlMsIENhbm9uaWNhbFRyZWVQYXJzZXIuY2xhc3MpLApAQCAtMTQxMCw5ICsxNDMzLDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gbWVyZ2VUcmVlV2FsayhUcmVlV2FsayB0cmVlV2FsaywgYm9vbGVhbiBpZ25vcmVDb25mbGljdHMpCiAJCQkJCXRyZWVXYWxrLmdldFRyZWUoVF9JTkRFWCwgRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yLmNsYXNzKSwKIAkJCQkJaGFzV29ya2luZ1RyZWVJdGVyYXRvciA/IHRyZWVXYWxrLmdldFRyZWUoVF9GSUxFLAogCQkJCQkJCVdvcmtpbmdUcmVlSXRlcmF0b3IuY2xhc3MpIDogbnVsbCwKLQkJCQkJaWdub3JlQ29uZmxpY3RzLCBoYXNBdHRyaWJ1dGVOb2RlUHJvdmlkZXIKLQkJCQkJCQk/IHRyZWVXYWxrLmdldEF0dHJpYnV0ZXMoKQotCQkJCQkJCTogTk9fQVRUUklCVVRFUykpIHsKKwkJCQkJaWdub3JlQ29uZmxpY3RzLCBhdHRyaWJ1dGVzKSkgewogCQkJCWNsZWFuVXAoKTsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvT2JqZWN0V2Fsay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL09iamVjdFdhbGsuamF2YQppbmRleCBlNmY5NTgwLi40ZTQ4YTVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvT2JqZWN0V2Fsay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9PYmplY3RXYWxrLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA4LCBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAyMiBTaGF3biBPLiBQZWFyY2UgPHNwZWFyY2VAc3BlYXJjZS5vcmc+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzOSw3ICsxMzksNyBAQCBwdWJsaWMgdm9pZCB2aXNpdGVkKFJldk9iamVjdCBvKSB7CiAJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSB0aGUgd2Fsa2VyIHdpbGwgb2J0YWluIGRhdGEgZnJvbS4KIAkgKi8KIAlwdWJsaWMgT2JqZWN0V2FsayhSZXBvc2l0b3J5IHJlcG8pIHsKLQkJdGhpcyhyZXBvLm5ld09iamVjdFJlYWRlcigpKTsKKwkJdGhpcyhyZXBvLm5ld09iamVjdFJlYWRlcigpLCB0cnVlKTsKIAl9CiAKIAkvKioKQEAgLTE1MSw3ICsxNTEsMTEgQEAgcHVibGljIE9iamVjdFdhbGsoUmVwb3NpdG9yeSByZXBvKSB7CiAJICogICAgICAgICAgICByZXF1aXJlZC4KIAkgKi8KIAlwdWJsaWMgT2JqZWN0V2FsayhPYmplY3RSZWFkZXIgb3IpIHsKLQkJc3VwZXIob3IpOworCQl0aGlzKG9yLCBmYWxzZSk7CisJfQorCisJcHJpdmF0ZSBPYmplY3RXYWxrKE9iamVjdFJlYWRlciBvciwgYm9vbGVhbiBjbG9zZVJlYWRlcikgeworCQlzdXBlcihvciwgY2xvc2VSZWFkZXIpOwogCQlzZXRSZXRhaW5Cb2R5KGZhbHNlKTsKIAkJcm9vdE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJcGVuZGluZ09iamVjdHMgPSBuZXcgQmxvY2tPYmpRdWV1ZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrLmphdmEKaW5kZXggOGQ1NzFmNS4uYTUwZWFmMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsay5qYXZhCkBAIC0yMTUsNyArMjE1LDcgQEAgcHVibGljIFJldldhbGsoT2JqZWN0UmVhZGVyIG9yKSB7CiAJCXRoaXMob3IsIGZhbHNlKTsKIAl9CiAKLQlwcml2YXRlIFJldldhbGsoT2JqZWN0UmVhZGVyIG9yLCBib29sZWFuIGNsb3NlUmVhZGVyKSB7CisJUmV2V2FsayhPYmplY3RSZWFkZXIgb3IsIGJvb2xlYW4gY2xvc2VSZWFkZXIpIHsKIAkJcmVhZGVyID0gb3I7CiAJCWlkQnVmZmVyID0gbmV3IE11dGFibGVPYmplY3RJZCgpOwogCQlvYmplY3RzID0gbmV3IE9iamVjdElkT3duZXJNYXA8PigpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbmZpZy5qYXZhCmluZGV4IGZkYTdhODEuLmM4Nzc0ZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29uZmlnLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE3LCBEYXZpZCBQdXJzZWhvdXNlIDxkYXZpZC5wdXJzZWhvdXNlQGdtYWlsLmNvbT4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDE3LCAyMDIyIERhdmlkIFB1cnNlaG91c2UgPGRhdmlkLnB1cnNlaG91c2VAZ21haWwuY29tPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCw3ICsxMCwxMCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKQEAgLTE5LDggKzIyLDkgQEAKICAqIEBzaW5jZSA0LjkKICAqLwogcHVibGljIGNsYXNzIFB1c2hDb25maWcgeworCiAJLyoqCi0JICogQ29uZmlnIHZhbHVlcyBmb3IgcHVzaC5yZWN1cnNlU3VibW9kdWxlcy4KKwkgKiBHaXQgY29uZmlnIHZhbHVlcyBmb3Ige0Bjb2RlIHB1c2gucmVjdXJzZVN1Ym1vZHVsZXN9LgogCSAqLwogCXB1YmxpYyBlbnVtIFB1c2hSZWN1cnNlU3VibW9kdWxlc01vZGUgaW1wbGVtZW50cyBDb25maWcuQ29uZmlnRW51bSB7CiAJCS8qKgpAQCAtNTksNCArNjMsMTAwIEBAIHB1YmxpYyBib29sZWFuIG1hdGNoQ29uZmlnVmFsdWUoU3RyaW5nIHMpIHsKIAkJCQkJfHwgY29uZmlnVmFsdWUuZXF1YWxzSWdub3JlQ2FzZShzKTsKIAkJfQogCX0KKworCS8qKgorCSAqIEdpdCBjb25maWcgdmFsdWVzIGZvciB7QGNvZGUgcHVzaC5kZWZhdWx0fS4KKwkgKgorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgZW51bSBQdXNoRGVmYXVsdCBpbXBsZW1lbnRzIENvbmZpZy5Db25maWdFbnVtIHsKKworCQkvKioKKwkJICogRG8gbm90IHB1c2ggaWYgdGhlcmUgYXJlIG5vIGV4cGxpY2l0IHJlZnNwZWNzLgorCQkgKi8KKwkJTk9USElORywKKworCQkvKioKKwkJICogUHVzaCB0aGUgY3VycmVudCBicmFuY2ggdG8gYW4gdXBzdHJlYW0gYnJhbmNoIG9mIHRoZSBzYW1lIG5hbWUuCisJCSAqLworCQlDVVJSRU5ULAorCisJCS8qKgorCQkgKiBQdXNoIHRoZSBjdXJyZW50IGJyYW5jaCB0byBhbiB1cHN0cmVhbSBicmFuY2ggZGV0ZXJtaW5lZCBieSBnaXQKKwkJICogY29uZmlnIHtAY29kZSBicmFuY2guPGN1cnJlbnRCcmFuY2g+Lm1lcmdlfS4KKwkJICovCisJCVVQU1RSRUFNKCJ0cmFja2luZyIpLCAvLyROT04tTkxTLTEkCisKKwkJLyoqCisJCSAqIExpa2Uge0BsaW5rICNVUFNUUkVBTX0sIGJ1dCBvbmx5IGlmIHRoZSB1cHN0cmVhbSBuYW1lIGlzIHRoZSBzYW1lIGFzCisJCSAqIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGxvY2FsIGJyYW5jaC4KKwkJICovCisJCVNJTVBMRSwKKworCQkvKioKKwkJICogUHVzaCBhbGwgY3VycmVudCBsb2NhbCBicmFuY2hlcyB0aGF0IG1hdGNoIGEgY29uZmlndXJlZCBwdXNoIHJlZnNwZWMKKwkJICogb2YgdGhlIHJlbW90ZSBjb25maWd1cmF0aW9uLgorCQkgKi8KKwkJTUFUQ0hJTkc7CisKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYWxpYXM7CisKKwkJcHJpdmF0ZSBQdXNoRGVmYXVsdCgpIHsKKwkJCWFsaWFzID0gbnVsbDsKKwkJfQorCisJCXByaXZhdGUgUHVzaERlZmF1bHQoU3RyaW5nIGFsaWFzKSB7CisJCQl0aGlzLmFsaWFzID0gYWxpYXM7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b0NvbmZpZ1ZhbHVlKCkgeworCQkJcmV0dXJuIG5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gbWF0Y2hDb25maWdWYWx1ZShTdHJpbmcgaW4pIHsKKwkJCXJldHVybiB0b0NvbmZpZ1ZhbHVlKCkuZXF1YWxzSWdub3JlQ2FzZShpbikKKwkJCQkJfHwgKGFsaWFzICE9IG51bGwgJiYgYWxpYXMuZXF1YWxzSWdub3JlQ2FzZShpbikpOworCQl9CisJfQorCisJcHJpdmF0ZSBmaW5hbCBQdXNoUmVjdXJzZVN1Ym1vZHVsZXNNb2RlIHJlY3Vyc2VTdWJtb2R1bGVzOworCisJcHJpdmF0ZSBmaW5hbCBQdXNoRGVmYXVsdCBwdXNoRGVmYXVsdDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisJICoKKwkgKiBAcGFyYW0gY29uZmlnCisJICogICAgICAgICAgICB7QGxpbmsgQ29uZmlnfSB0byBmaWxsIHRoZSB7QGxpbmsgUHVzaENvbmZpZ30gZnJvbQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgUHVzaENvbmZpZyhDb25maWcgY29uZmlnKSB7CisJCXJlY3Vyc2VTdWJtb2R1bGVzID0gY29uZmlnLmdldEVudW0oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19QVVNIX1NFQ1RJT04sCisJCQkJbnVsbCwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUkVDVVJTRV9TVUJNT0RVTEVTLAorCQkJCVB1c2hSZWN1cnNlU3VibW9kdWxlc01vZGUuTk8pOworCQlwdXNoRGVmYXVsdCA9IGNvbmZpZy5nZXRFbnVtKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfUFVTSF9TRUNUSU9OLCBudWxsLAorCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX0RFRkFVTFQsIFB1c2hEZWZhdWx0LlNJTVBMRSk7CisJfQorCisJLyoqCisJICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBnaXQgY29uZmlnIHtAY29kZSBwdXNoLnJlY3Vyc2VTdWJtb2R1bGVzfS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHZhbHVlCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBQdXNoUmVjdXJzZVN1Ym1vZHVsZXNNb2RlIGdldFJlY3Vyc2VTdWJtb2R1bGVzKCkgeworCQlyZXR1cm4gcmVjdXJzZVN1Ym1vZHVsZXM7CisJfQorCisJLyoqCisJICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBnaXQgY29uZmlnIHtAY29kZSBwdXNoLmRlZmF1bHR9LgorCSAqCisJICogQHJldHVybiB0aGUgdmFsdWUKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIFB1c2hEZWZhdWx0IGdldFB1c2hEZWZhdWx0KCkgeworCQlyZXR1cm4gcHVzaERlZmF1bHQ7CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzLmphdmEKaW5kZXggYTI0NGM1NS4uOTQyZGFkNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3MuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzcy5qYXZhCkBAIC0xOCwxMSArMTgsMTUgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5BYm9ydGVkQnlIb29rRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm90U3VwcG9ydGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzLlByZVB1c2hIb29rOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CkBAIC01OCw2ICs2Miw4IEBAIGNsYXNzIFB1c2hQcm9jZXNzIHsKIAkvKiogQSBsaXN0IG9mIG9wdGlvbiBzdHJpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHB1c2ggKi8KIAlwcml2YXRlIExpc3Q8U3RyaW5nPiBwdXNoT3B0aW9uczsKIAorCXByaXZhdGUgZmluYWwgUHJlUHVzaEhvb2sgcHJlUHVzaDsKKwogCS8qKgogCSAqIENyZWF0ZSBwcm9jZXNzIGZvciBzcGVjaWZpZWQgdHJhbnNwb3J0IGFuZCByZWZzIHVwZGF0ZXMgc3BlY2lmaWNhdGlvbi4KIAkgKgpAQCAtNjYsMTIgKzcyLDE0IEBAIGNsYXNzIFB1c2hQcm9jZXNzIHsKIAkgKiAgICAgICAgICAgIGNvbm5lY3Rpb24uCiAJICogQHBhcmFtIHRvUHVzaAogCSAqICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBvZiByZWZzIHVwZGF0ZXMgKGFuZCBsb2NhbCB0cmFja2luZyBicmFuY2hlcykuCi0JICoKKwkgKiBAcGFyYW0gcHJlUHVzaAorCSAqICAgICAgICAgICAge0BsaW5rIFByZVB1c2hIb29rfSB0byBydW4gYWZ0ZXIgdGhlIHJlbW90ZSBhZHZlcnRpc2VtZW50IGhhcworCSAqICAgICAgICAgICAgYmVlbiBnb3R0ZW4KIAkgKiBAdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbgogCSAqLwotCVB1c2hQcm9jZXNzKGZpbmFsIFRyYW5zcG9ydCB0cmFuc3BvcnQsCi0JCQlmaW5hbCBDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gdG9QdXNoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKLQkJdGhpcyh0cmFuc3BvcnQsIHRvUHVzaCwgbnVsbCk7CisJUHVzaFByb2Nlc3MoVHJhbnNwb3J0IHRyYW5zcG9ydCwgQ29sbGVjdGlvbjxSZW1vdGVSZWZVcGRhdGU+IHRvUHVzaCwKKwkJCVByZVB1c2hIb29rIHByZVB1c2gpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCQl0aGlzKHRyYW5zcG9ydCwgdG9QdXNoLCBwcmVQdXNoLCBudWxsKTsKIAl9CiAKIAkvKioKQEAgLTgyLDE2ICs5MCwxOSBAQCBjbGFzcyBQdXNoUHJvY2VzcyB7CiAJICogICAgICAgICAgICBjb25uZWN0aW9uLgogCSAqIEBwYXJhbSB0b1B1c2gKIAkgKiAgICAgICAgICAgIHNwZWNpZmljYXRpb24gb2YgcmVmcyB1cGRhdGVzIChhbmQgbG9jYWwgdHJhY2tpbmcgYnJhbmNoZXMpLgorCSAqIEBwYXJhbSBwcmVQdXNoCisJICogICAgICAgICAgICB7QGxpbmsgUHJlUHVzaEhvb2t9IHRvIHJ1biBhZnRlciB0aGUgcmVtb3RlIGFkdmVydGlzZW1lbnQgaGFzCisJICogICAgICAgICAgICBiZWVuIGdvdHRlbgogCSAqIEBwYXJhbSBvdXQKIAkgKiAgICAgICAgICAgIE91dHB1dFN0cmVhbSB0byB3cml0ZSBtZXNzYWdlcyB0bwogCSAqIEB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uCiAJICovCi0JUHVzaFByb2Nlc3MoZmluYWwgVHJhbnNwb3J0IHRyYW5zcG9ydCwKLQkJCWZpbmFsIENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiB0b1B1c2gsIE91dHB1dFN0cmVhbSBvdXQpCi0JCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlQdXNoUHJvY2VzcyhUcmFuc3BvcnQgdHJhbnNwb3J0LCBDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gdG9QdXNoLAorCQkJUHJlUHVzaEhvb2sgcHJlUHVzaCwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRoaXMud2Fsa2VyID0gbmV3IFJldldhbGsodHJhbnNwb3J0LmxvY2FsKTsKIAkJdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CiAJCXRoaXMudG9QdXNoID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOworCQl0aGlzLnByZVB1c2ggPSBwcmVQdXNoOwogCQl0aGlzLm91dCA9IG91dDsKIAkJdGhpcy5wdXNoT3B0aW9ucyA9IHRyYW5zcG9ydC5nZXRQdXNoT3B0aW9ucygpOwogCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gpIHsKQEAgLTEyOSwxMCArMTQwLDM4IEBAIFB1c2hSZXN1bHQgZXhlY3V0ZShQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJCQlyZXMuc2V0QWR2ZXJ0aXNlZFJlZnModHJhbnNwb3J0LmdldFVSSSgpLCBjb25uZWN0aW9uCiAJCQkJCQkuZ2V0UmVmc01hcCgpKTsKIAkJCQlyZXMucGVlclVzZXJBZ2VudCA9IGNvbm5lY3Rpb24uZ2V0UGVlclVzZXJBZ2VudCgpOwotCQkJCXJlcy5zZXRSZW1vdGVVcGRhdGVzKHRvUHVzaCk7CiAJCQkJbW9uaXRvci5lbmRUYXNrKCk7CiAKKwkJCQlNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IGV4cGFuZGVkID0gZXhwYW5kTWF0Y2hpbmcoKTsKKwkJCQl0b1B1c2guY2xlYXIoKTsKKwkJCQl0b1B1c2gucHV0QWxsKGV4cGFuZGVkKTsKKworCQkJCXJlcy5zZXRSZW1vdGVVcGRhdGVzKHRvUHVzaCk7CiAJCQkJZmluYWwgTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiBwcmVwcm9jZXNzZWQgPSBwcmVwYXJlUmVtb3RlVXBkYXRlcygpOworCQkJCUxpc3Q8UmVtb3RlUmVmVXBkYXRlPiB3aWxsQmVBdHRlbXB0ZWQgPSBwcmVwcm9jZXNzZWQudmFsdWVzKCkKKwkJCQkJCS5zdHJlYW0oKS5maWx0ZXIodSAtPiB7CisJCQkJCQkJc3dpdGNoICh1LmdldFN0YXR1cygpKSB7CisJCQkJCQkJY2FzZSBOT05fRVhJU1RJTkc6CisJCQkJCQkJY2FzZSBSRUpFQ1RFRF9OT0RFTEVURToKKwkJCQkJCQljYXNlIFJFSkVDVEVEX05PTkZBU1RGT1JXQVJEOgorCQkJCQkJCWNhc2UgUkVKRUNURURfT1RIRVJfUkVBU09OOgorCQkJCQkJCWNhc2UgUkVKRUNURURfUkVNT1RFX0NIQU5HRUQ6CisJCQkJCQkJY2FzZSBVUF9UT19EQVRFOgorCQkJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQkJfQorCQkJCQkJfSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCQlpZiAoIXdpbGxCZUF0dGVtcHRlZC5pc0VtcHR5KCkpIHsKKwkJCQkJaWYgKHByZVB1c2ggIT0gbnVsbCkgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQlwcmVQdXNoLnNldFJlZnMod2lsbEJlQXR0ZW1wdGVkKTsKKwkJCQkJCQlwcmVQdXNoLmNhbGwoKTsKKwkJCQkJCX0gY2F0Y2ggKEFib3J0ZWRCeUhvb2tFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CiAJCQkJaWYgKHRyYW5zcG9ydC5pc0RyeVJ1bigpKQogCQkJCQltb2RpZnlVcGRhdGVzRm9yRHJ5UnVuKCk7CiAJCQkJZWxzZSBpZiAoIXByZXByb2Nlc3NlZC5pc0VtcHR5KCkpCkBAIC0yMDEsMjUgKzI0MCw4IEBAIHByaXZhdGUgTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiBwcmVwYXJlUmVtb3RlVXBkYXRlcygpCiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCS8vIGNoZWNrIGZvciBmYXN0LWZvcndhcmQ6Ci0JCQkvLyAtIGJvdGggb2xkIGFuZCBuZXcgcmVmIG11c3QgcG9pbnQgdG8gY29tbWl0cywgQU5ECi0JCQkvLyAtIGJvdGggb2YgdGhlbSBtdXN0IGJlIGtub3duIGZvciB1cywgZXhpc3QgaW4gcmVwb3NpdG9yeSwgQU5ECi0JCQkvLyAtIG9sZCBjb21taXQgbXVzdCBiZSBhbmNlc3RvciBvZiBuZXcgY29tbWl0Ci0JCQlib29sZWFuIGZhc3RGb3J3YXJkID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJUmV2T2JqZWN0IG9sZFJldiA9IHdhbGtlci5wYXJzZUFueShhZHZlcnRpc2VkT2xkKTsKLQkJCQlmaW5hbCBSZXZPYmplY3QgbmV3UmV2ID0gd2Fsa2VyLnBhcnNlQW55KHJydS5nZXROZXdPYmplY3RJZCgpKTsKLQkJCQlpZiAoIShvbGRSZXYgaW5zdGFuY2VvZiBSZXZDb21taXQpCi0JCQkJCQl8fCAhKG5ld1JldiBpbnN0YW5jZW9mIFJldkNvbW1pdCkKLQkJCQkJCXx8ICF3YWxrZXIuaXNNZXJnZWRJbnRvKChSZXZDb21taXQpIG9sZFJldiwKLQkJCQkJCQkJKFJldkNvbW1pdCkgbmV3UmV2KSkKLQkJCQkJZmFzdEZvcndhcmQgPSBmYWxzZTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdPYmplY3RFeGNlcHRpb24geCkgewotCQkJCWZhc3RGb3J3YXJkID0gZmFsc2U7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24geCkgewotCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odHJhbnNwb3J0LmdldFVSSSgpLCBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUpHaXRUZXh0LmdldCgpLnJlYWRpbmdPYmplY3RzRnJvbUxvY2FsUmVwb3NpdG9yeUZhaWxlZCwgeC5nZXRNZXNzYWdlKCkpLCB4KTsKLQkJCX0KKwkJCWJvb2xlYW4gZmFzdEZvcndhcmQgPSBpc0Zhc3RGb3J3YXJkKGFkdmVydGlzZWRPbGQsCisJCQkJCXJydS5nZXROZXdPYmplY3RJZCgpKTsKIAkJCXJydS5zZXRGYXN0Rm9yd2FyZChmYXN0Rm9yd2FyZCk7CiAJCQlpZiAoIWZhc3RGb3J3YXJkICYmICFycnUuaXNGb3JjZVVwZGF0ZSgpKSB7CiAJCQkJcnJ1LnNldFN0YXR1cyhTdGF0dXMuUkVKRUNURURfTk9ORkFTVEZPUldBUkQpOwpAQCAtMjMzLDYgKzI1NSwxMzQgQEAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHByZXBhcmVSZW1vdGVVcGRhdGVzKCkKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKKwkvKioKKwkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gdXBkYXRlIGZyb20ge0Bjb2RlIG9sZE9pZH0gdG8ge0Bjb2RlIG5ld09pZH0gaXMgYQorCSAqIGZhc3QtZm9yd2FyZCB1cGRhdGU6CisJICogPHVsPgorCSAqIDxsaT5ib3RoIG9sZCBhbmQgbmV3IG11c3QgYmUgY29tbWl0cywgQU5EPC9saT4KKwkgKiA8bGk+Ym90aCBvZiB0aGVtIG11c3QgYmUga25vd24gdG8gdXMgYW5kIGV4aXN0IGluIHRoZSByZXBvc2l0b3J5LAorCSAqIEFORDwvbGk+CisJICogPGxpPnRoZSBvbGQgY29tbWl0IG11c3QgYmUgYW4gYW5jZXN0b3Igb2YgdGhlIG5ldyBjb21taXQuPC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHBhcmFtIG9sZE9pZAorCSAqICAgICAgICAgICAge0BsaW5rIE9iamVjdElkfcKgb2YgdGhlIG9sZCBjb21taXQKKwkgKiBAcGFyYW0gbmV3T2lkCisJICogICAgICAgICAgICB7QGxpbmsgT2JqZWN0SWR9wqBvZiB0aGUgbmV3IGNvbW1pdAorCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB1cGRhdGUgZmFzdC1mb3J3YXJkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKwkgKiBAdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0Zhc3RGb3J3YXJkKE9iamVjdElkIG9sZE9pZCwgT2JqZWN0SWQgbmV3T2lkKQorCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlSZXZPYmplY3Qgb2xkUmV2ID0gd2Fsa2VyLnBhcnNlQW55KG9sZE9pZCk7CisJCQlSZXZPYmplY3QgbmV3UmV2ID0gd2Fsa2VyLnBhcnNlQW55KG5ld09pZCk7CisJCQlpZiAoIShvbGRSZXYgaW5zdGFuY2VvZiBSZXZDb21taXQpIHx8ICEobmV3UmV2IGluc3RhbmNlb2YgUmV2Q29tbWl0KQorCQkJCQl8fCAhd2Fsa2VyLmlzTWVyZ2VkSW50bygoUmV2Q29tbWl0KSBvbGRSZXYsCisJCQkJCQkJKFJldkNvbW1pdCkgbmV3UmV2KSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSBjYXRjaCAoTWlzc2luZ09iamVjdEV4Y2VwdGlvbiB4KSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHRyYW5zcG9ydC5nZXRVUkkoKSwKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQKKwkJCQkJCQkuZ2V0KCkucmVhZGluZ09iamVjdHNGcm9tTG9jYWxSZXBvc2l0b3J5RmFpbGVkLAorCQkJCQkJCXguZ2V0TWVzc2FnZSgpKSwKKwkJCQkJeCk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogRXhwYW5kcyBhbGwgcGxhY2Vob2xkZXIge0BsaW5rIFJlbW90ZVJlZlVwZGF0ZX1zIGZvciAibWF0Y2hpbmciCisJICoge0BsaW5rIFJlZlNwZWN9cyAiOiIgaW4ge0BsaW5rICN0b1B1c2h9IGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgbWFwIGluCisJICogd2hpY2ggdGhlIHBsYWNlaG9sZGVycyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgdGhlaXIgZXhwYW5zaW9uLgorCSAqCisJICogQHJldHVybiBhIG5ldyBtYXAgb2Yge0BsaW5rIFJlbW90ZVJlZlVwZGF0ZX1zIGtleWVkIGJ5IHJlbW90ZSBuYW1lCisJICogQHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgZXhwYW5zaW9uIHJlc3VsdHMgaW4gZHVwbGljYXRlIHVwZGF0ZXMKKwkgKi8KKwlwcml2YXRlIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gZXhwYW5kTWF0Y2hpbmcoKQorCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOworCQlib29sZWFuIGhhZE1hdGNoID0gZmFsc2U7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHVwZGF0ZSA6IHRvUHVzaC52YWx1ZXMoKSkgeworCQkJaWYgKHVwZGF0ZS5pc01hdGNoaW5nKCkpIHsKKwkJCQlpZiAoaGFkTWF0Y2gpIHsKKwkJCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQlKR2l0VGV4dC5nZXQoKS5kdXBsaWNhdGVSZW1vdGVSZWZVcGRhdGVJc0lsbGVnYWwsCisJCQkJCQkJIjoiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJZXhwYW5kTWF0Y2hpbmcocmVzdWx0LCB1cGRhdGUpOworCQkJCWhhZE1hdGNoID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAocmVzdWx0LnB1dCh1cGRhdGUuZ2V0UmVtb3RlTmFtZSgpLCB1cGRhdGUpICE9IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJSkdpdFRleHQuZ2V0KCkuZHVwbGljYXRlUmVtb3RlUmVmVXBkYXRlSXNJbGxlZ2FsLAorCQkJCQkJdXBkYXRlLmdldFJlbW90ZU5hbWUoKSkpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogRXhwYW5kcyB0aGUgcGxhY2Vob2xkZXIge0BsaW5rIFJlbW90ZVJlZlVwZGF0ZX0ge0Bjb2RlIG1hdGNofSBmb3IgYQorCSAqICJtYXRjaGluZyIge0BsaW5rIFJlZlNwZWN9ICI6IiBvciAiKzoiIGFuZCBwdXRzIHRoZSBleHBhbnNpb24gaW50byB0aGUKKwkgKiBnaXZlbiBtYXAge0Bjb2RlIHVwZGF0ZXN9LgorCSAqCisJICogQHBhcmFtIHVwZGF0ZXMKKwkgKiAgICAgICAgICAgIG1hcCB0byBwdXQgdGhlIGV4cGFuc2lvbiBpbgorCSAqIEBwYXJhbSBtYXRjaAorCSAqICAgICAgICAgICAgdGhlIHBsYWNlaG9sZGVyIHtAbGluayBSZW1vdGVSZWZVcGRhdGV9IHRvIGV4cGFuZAorCSAqCisJICogQHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiB0aGUgZXhwYW5zaW9uIHJlc3VsdHMgaW4gZHVwbGljYXRlIHVwZGF0ZXMsIG9yIHRoZSBsb2NhbAorCSAqICAgICAgICAgICAgIGJyYW5jaGVzIGNhbm5vdCBiZSBkZXRlcm1pbmVkCisJICovCisJcHJpdmF0ZSB2b2lkIGV4cGFuZE1hdGNoaW5nKE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcywKKwkJCVJlbW90ZVJlZlVwZGF0ZSBtYXRjaCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlNYXA8U3RyaW5nLCBSZWY+IGFkdmVydGlzZW1lbnQgPSBjb25uZWN0aW9uLmdldFJlZnNNYXAoKTsKKwkJCUNvbGxlY3Rpb248UmVmU3BlYz4gZmV0Y2hTcGVjcyA9IG1hdGNoLmdldEZldGNoU3BlY3MoKTsKKwkJCWJvb2xlYW4gZm9yY2VVcGRhdGUgPSBtYXRjaC5pc0ZvcmNlVXBkYXRlKCk7CisJCQlmb3IgKFJlZiBsb2NhbCA6IHRyYW5zcG9ydC5sb2NhbC5nZXRSZWZEYXRhYmFzZSgpCisJCQkJCS5nZXRSZWZzQnlQcmVmaXgoQ29uc3RhbnRzLlJfSEVBRFMpKSB7CisJCQkJaWYgKGxvY2FsLmlzU3ltYm9saWMoKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJU3RyaW5nIG5hbWUgPSBsb2NhbC5nZXROYW1lKCk7CisJCQkJUmVmIGFkdmVydGlzZWQgPSBhZHZlcnRpc2VtZW50LmdldChuYW1lKTsKKwkJCQlpZiAoYWR2ZXJ0aXNlZCA9PSBudWxsIHx8IGFkdmVydGlzZWQuaXNTeW1ib2xpYygpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlPYmplY3RJZCBvbGRPaWQgPSBhZHZlcnRpc2VkLmdldE9iamVjdElkKCk7CisJCQkJaWYgKG9sZE9pZCA9PSBudWxsIHx8IE9iamVjdElkLnplcm9JZCgpLmVxdWFscyhvbGRPaWQpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlPYmplY3RJZCBuZXdPaWQgPSBsb2NhbC5nZXRPYmplY3RJZCgpOworCQkJCWlmIChuZXdPaWQgPT0gbnVsbCB8fCBPYmplY3RJZC56ZXJvSWQoKS5lcXVhbHMobmV3T2lkKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlSZW1vdGVSZWZVcGRhdGUgcnJ1ID0gbmV3IFJlbW90ZVJlZlVwZGF0ZSh0cmFuc3BvcnQubG9jYWwsIG5hbWUsCisJCQkJCQluZXdPaWQsIG5hbWUsIGZvcmNlVXBkYXRlLAorCQkJCQkJVHJhbnNwb3J0LmZpbmRUcmFja2luZ1JlZk5hbWUobmFtZSwgZmV0Y2hTcGVjcyksCisJCQkJCQlvbGRPaWQpOworCQkJCWlmICh1cGRhdGVzLnB1dChycnUuZ2V0UmVtb3RlTmFtZSgpLCBycnUpICE9IG51bGwpIHsKKwkJCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQlKR2l0VGV4dC5nZXQoKS5kdXBsaWNhdGVSZW1vdGVSZWZVcGRhdGVJc0lsbGVnYWwsCisJCQkJCQkJcnJ1LmdldFJlbW90ZU5hbWUoKSkpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgeworCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbih0cmFuc3BvcnQuZ2V0VVJJKCksCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0CisJCQkJCQkJLmdldCgpLnJlYWRpbmdPYmplY3RzRnJvbUxvY2FsUmVwb3NpdG9yeUZhaWxlZCwKKwkJCQkJCQl4LmdldE1lc3NhZ2UoKSksCisJCQkJCXgpOworCQl9CisJfQorCiAJcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlamVjdEFsbCgpIHsKIAkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoLnZhbHVlcygpKSB7CiAJCQlpZiAocnJ1LmdldFN0YXR1cygpID09IFN0YXR1cy5OT1RfQVRURU1QVEVEKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjLmphdmEKaW5kZXggYWMzNTdhZi4uNTZkMDAzNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlYy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWMuamF2YQpAQCAtMTIsMTEgKzEyLDExIEBACiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmVmZXJlbmNlczsKIAogLyoqCiAgKiBEZXNjcmliZXMgaG93IHJlZnMgaW4gb25lIHJlcG9zaXRvcnkgY29weSBpbnRvIGFub3RoZXIgcmVwb3NpdG9yeS4KQEAgLTUwLDYgKzUwLDkgQEAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2lsZGNhcmQoU3RyaW5nIHMpIHsKIAkvKiogSXMgdGhpcyBzcGVjaWZpY2F0aW9uIGFjdHVhbGx5IGEgd2lsZGNhcmQgbWF0Y2g/ICovCiAJcHJpdmF0ZSBib29sZWFuIHdpbGRjYXJkOwogCisJLyoqIElzIHRoaXMgdGhlIHNwZWNpYWwgIjoiIFJlZlNwZWM/ICovCisJcHJpdmF0ZSBib29sZWFuIG1hdGNoaW5nOworCiAJLyoqCiAJICogSG93IHN0cmljdCB0byBiZSBhYm91dCB3aWxkY2FyZHMuCiAJICoKQEAgLTcxLDYgKzc0LDcgQEAgcHVibGljIGVudW0gV2lsZGNhcmRNb2RlIHsKIAkJICovCiAJCUFMTE9XX01JU01BVENICiAJfQorCiAJLyoqIFdoZXRoZXIgYSB3aWxkY2FyZCBpcyBhbGxvd2VkIG9uIG9uZSBzaWRlIGJ1dCBub3QgdGhlIG90aGVyLiAqLwogCXByaXZhdGUgV2lsZGNhcmRNb2RlIGFsbG93TWlzbWF0Y2hlZFdpbGRjYXJkczsKIApAQCAtODcsNiArOTEsNyBAQCBwdWJsaWMgZW51bSBXaWxkY2FyZE1vZGUgewogCSAqIGFwcGxpY2F0aW9ucywgYXMgYXQgbGVhc3Qgb25lIGZpZWxkIG11c3QgYmUgc2V0IHRvIG1hdGNoIGEgc291cmNlIG5hbWUuCiAJICovCiAJcHVibGljIFJlZlNwZWMoKSB7CisJCW1hdGNoaW5nID0gZmFsc2U7CiAJCWZvcmNlID0gZmFsc2U7CiAJCXdpbGRjYXJkID0gZmFsc2U7CiAJCXNyY05hbWUgPSBDb25zdGFudHMuSEVBRDsKQEAgLTEzMywxNyArMTM4LDI1IEBAIHB1YmxpYyBSZWZTcGVjKFN0cmluZyBzcGVjLCBXaWxkY2FyZE1vZGUgbW9kZSkgewogCQkJcyA9IHMuc3Vic3RyaW5nKDEpOwogCQl9CiAKKwkJYm9vbGVhbiBtYXRjaFB1c2hTcGVjID0gZmFsc2U7CiAJCWZpbmFsIGludCBjID0gcy5sYXN0SW5kZXhPZignOicpOwogCQlpZiAoYyA9PSAwKSB7CiAJCQlzID0gcy5zdWJzdHJpbmcoMSk7Ci0JCQlpZiAoaXNXaWxkY2FyZChzKSkgeworCQkJaWYgKHMuaXNFbXB0eSgpKSB7CisJCQkJbWF0Y2hQdXNoU3BlYyA9IHRydWU7CiAJCQkJd2lsZGNhcmQgPSB0cnVlOwotCQkJCWlmIChtb2RlID09IFdpbGRjYXJkTW9kZS5SRVFVSVJFX01BVENIKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAotCQkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZFdpbGRjYXJkcywgc3BlYykpOworCQkJCXNyY05hbWUgPSBDb25zdGFudHMuUl9IRUFEUyArICcqJzsKKwkJCQlkc3ROYW1lID0gc3JjTmFtZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGlzV2lsZGNhcmQocykpIHsKKwkJCQkJd2lsZGNhcmQgPSB0cnVlOworCQkJCQlpZiAobW9kZSA9PSBXaWxkY2FyZE1vZGUuUkVRVUlSRV9NQVRDSCkgeworCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZFdpbGRjYXJkcywgc3BlYykpOworCQkJCQl9CiAJCQkJfQorCQkJCWRzdE5hbWUgPSBjaGVja1ZhbGlkKHMpOwogCQkJfQotCQkJZHN0TmFtZSA9IGNoZWNrVmFsaWQocyk7CiAJCX0gZWxzZSBpZiAoYyA+IDApIHsKIAkJCVN0cmluZyBzcmMgPSBzLnN1YnN0cmluZygwLCBjKTsKIAkJCVN0cmluZyBkc3QgPSBzLnN1YnN0cmluZyhjICsgMSk7CkBAIC0xNjgsNiArMTgxLDcgQEAgcHVibGljIFJlZlNwZWMoU3RyaW5nIHNwZWMsIFdpbGRjYXJkTW9kZSBtb2RlKSB7CiAJCQl9CiAJCQlzcmNOYW1lID0gY2hlY2tWYWxpZChzKTsKIAkJfQorCQltYXRjaGluZyA9IG1hdGNoUHVzaFNwZWM7CiAJfQogCiAJLyoqCkBAIC0xOTUsNiArMjA5LDcgQEAgcHVibGljIFJlZlNwZWMoU3RyaW5nIHNwZWMpIHsKIAl9CiAKIAlwcml2YXRlIFJlZlNwZWMoUmVmU3BlYyBwKSB7CisJCW1hdGNoaW5nID0gZmFsc2U7CiAJCWZvcmNlID0gcC5pc0ZvcmNlVXBkYXRlKCk7CiAJCXdpbGRjYXJkID0gcC5pc1dpbGRjYXJkKCk7CiAJCXNyY05hbWUgPSBwLmdldFNvdXJjZSgpOwpAQCAtMjAzLDYgKzIxOCwxNyBAQCBwcml2YXRlIFJlZlNwZWMoUmVmU3BlYyBwKSB7CiAJfQogCiAJLyoqCisJICogVGVsbHMgd2hldGhlciB0aGlzIHtAbGluayBSZWZTcGVjfSBpcyB0aGUgc3BlY2lhbCAibWF0Y2hpbmciIFJlZlNwZWMgIjoiCisJICogZm9yIHB1c2hpbmcuCisJICoKKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhICJtYXRjaGluZyIgUmVmU3BlYworCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01hdGNoaW5nKCkgeworCQlyZXR1cm4gbWF0Y2hpbmc7CisJfQorCisJLyoqCiAJICogQ2hlY2sgaWYgdGhpcyBzcGVjaWZpY2F0aW9uIHdhbnRzIHRvIGZvcmNlZnVsbHkgdXBkYXRlIHRoZSBkZXN0aW5hdGlvbi4KIAkgKgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHNwZWNpZmljYXRpb24gYXNrcyBmb3IgdXBkYXRlcyB3aXRob3V0IG1lcmdlIHRlc3RzLgpAQCAtMjIwLDYgKzI0Niw3IEBAIHB1YmxpYyBib29sZWFuIGlzRm9yY2VVcGRhdGUoKSB7CiAJICovCiAJcHVibGljIFJlZlNwZWMgc2V0Rm9yY2VVcGRhdGUoYm9vbGVhbiBmb3JjZVVwZGF0ZSkgewogCQlmaW5hbCBSZWZTcGVjIHIgPSBuZXcgUmVmU3BlYyh0aGlzKTsKKwkJci5tYXRjaGluZyA9IG1hdGNoaW5nOwogCQlyLmZvcmNlID0gZm9yY2VVcGRhdGU7CiAJCXJldHVybiByOwogCX0KQEAgLTMyMiw4ICszNDksNyBAQCBwdWJsaWMgUmVmU3BlYyBzZXREZXN0aW5hdGlvbihTdHJpbmcgZGVzdGluYXRpb24pIHsKIAkgKiAgICAgICAgICAgICBUaGUgd2lsZGNhcmQgc3RhdHVzIG9mIHRoZSBuZXcgc291cmNlIGRpc2FncmVlcyB3aXRoIHRoZQogCSAqICAgICAgICAgICAgIHdpbGRjYXJkIHN0YXR1cyBvZiB0aGUgbmV3IGRlc3RpbmF0aW9uLgogCSAqLwotCXB1YmxpYyBSZWZTcGVjIHNldFNvdXJjZURlc3RpbmF0aW9uKGZpbmFsIFN0cmluZyBzb3VyY2UsCi0JCQlmaW5hbCBTdHJpbmcgZGVzdGluYXRpb24pIHsKKwlwdWJsaWMgUmVmU3BlYyBzZXRTb3VyY2VEZXN0aW5hdGlvbihTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVzdGluYXRpb24pIHsKIAkJaWYgKGlzV2lsZGNhcmQoc291cmNlKSAhPSBpc1dpbGRjYXJkKGRlc3RpbmF0aW9uKSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuc291cmNlRGVzdGluYXRpb25NdXN0TWF0Y2gpOwogCQlmaW5hbCBSZWZTcGVjIHIgPSBuZXcgUmVmU3BlYyh0aGlzKTsKQEAgLTU0MSwzNyArNTY3LDM2IEBAIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJCWlmICghKG9iaiBpbnN0YW5jZW9mIFJlZlNwZWMpKQogCQkJcmV0dXJuIGZhbHNlOwogCQlmaW5hbCBSZWZTcGVjIGIgPSAoUmVmU3BlYykgb2JqOwotCQlpZiAoaXNGb3JjZVVwZGF0ZSgpICE9IGIuaXNGb3JjZVVwZGF0ZSgpKQorCQlpZiAoaXNGb3JjZVVwZGF0ZSgpICE9IGIuaXNGb3JjZVVwZGF0ZSgpKSB7CiAJCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpc1dpbGRjYXJkKCkgIT0gYi5pc1dpbGRjYXJkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZXEoZ2V0U291cmNlKCksIGIuZ2V0U291cmNlKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWVxKGdldERlc3RpbmF0aW9uKCksIGIuZ2V0RGVzdGluYXRpb24oKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXEoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCWlmIChSZWZlcmVuY2VzLmlzU2FtZU9iamVjdChhLCBiKSkgewotCQkJcmV0dXJuIHRydWU7CiAJCX0KLQkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpCisJCWlmIChpc01hdGNoaW5nKCkpIHsKKwkJCXJldHVybiBiLmlzTWF0Y2hpbmcoKTsKKwkJfSBlbHNlIGlmIChiLmlzTWF0Y2hpbmcoKSkgewogCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYS5lcXVhbHMoYik7CisJCX0KKwkJcmV0dXJuIGlzV2lsZGNhcmQoKSA9PSBiLmlzV2lsZGNhcmQoKQorCQkJCSYmIE9iamVjdHMuZXF1YWxzKGdldFNvdXJjZSgpLCBiLmdldFNvdXJjZSgpKQorCQkJCSYmIE9iamVjdHMuZXF1YWxzKGdldERlc3RpbmF0aW9uKCksIGIuZ2V0RGVzdGluYXRpb24oKSk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlpZiAoaXNGb3JjZVVwZGF0ZSgpKQorCQlpZiAoaXNGb3JjZVVwZGF0ZSgpKSB7CiAJCQlyLmFwcGVuZCgnKycpOwotCQlpZiAoZ2V0U291cmNlKCkgIT0gbnVsbCkKLQkJCXIuYXBwZW5kKGdldFNvdXJjZSgpKTsKLQkJaWYgKGdldERlc3RpbmF0aW9uKCkgIT0gbnVsbCkgeworCQl9CisJCWlmIChpc01hdGNoaW5nKCkpIHsKIAkJCXIuYXBwZW5kKCc6Jyk7Ci0JCQlyLmFwcGVuZChnZXREZXN0aW5hdGlvbigpKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChnZXRTb3VyY2UoKSAhPSBudWxsKSB7CisJCQkJci5hcHBlbmQoZ2V0U291cmNlKCkpOworCQkJfQorCQkJaWYgKGdldERlc3RpbmF0aW9uKCkgIT0gbnVsbCkgeworCQkJCXIuYXBwZW5kKCc6Jyk7CisJCQkJci5hcHBlbmQoZ2V0RGVzdGluYXRpb24oKSk7CisJCQl9CiAJCX0KIAkJcmV0dXJuIHIudG9TdHJpbmcoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVSZWZVcGRhdGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhCmluZGV4IDQzZWFhYzcuLjIxOGU2MmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhCkBAIC0xMiw3ICsxMiw5IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5Ob25OdWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwpAQCAtMTE2LDYgKzExOCwxMiBAQCBwdWJsaWMgZW51bSBTdGF0dXMgewogCXByaXZhdGUgUmVmVXBkYXRlIGxvY2FsVXBkYXRlOwogCiAJLyoqCisJICogSWYgc2V0LCB0aGUgUmVtb3RlUmVmVXBkYXRlIGlzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSAibWF0Y2hpbmciIFJlZlNwZWMKKwkgKiB0byBiZSBleHBhbmRlZCBhZnRlciB0aGUgYWR2ZXJ0aXNlbWVudHMgaGF2ZSBiZWVuIHJlY2VpdmVkIGluIGEgcHVzaC4KKwkgKi8KKwlwcml2YXRlIENvbGxlY3Rpb248UmVmU3BlYz4gZmV0Y2hTcGVjczsKKworCS8qKgogCSAqIENvbnN0cnVjdCByZW1vdGUgcmVmIHVwZGF0ZSByZXF1ZXN0IGJ5IHByb3ZpZGluZyBhbiB1cGRhdGUgc3BlY2lmaWNhdGlvbi4KIAkgKiBPYmplY3QgaXMgY3JlYXRlZCB3aXRoIGRlZmF1bHQKIAkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVtb3RlUmVmVXBkYXRlLlN0YXR1cyNOT1RfQVRURU1QVEVEfQpAQCAtMTU3LDkgKzE2NSw4IEBAIHB1YmxpYyBlbnVtIFN0YXR1cyB7CiAJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgc29tZSByZXF1aXJlZCBwYXJhbWV0ZXIgd2FzIG51bGwKIAkgKi8KLQlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWxEYiwgZmluYWwgU3RyaW5nIHNyY1JlZiwKLQkJCWZpbmFsIFN0cmluZyByZW1vdGVOYW1lLCBmaW5hbCBib29sZWFuIGZvcmNlVXBkYXRlLAotCQkJZmluYWwgU3RyaW5nIGxvY2FsTmFtZSwgZmluYWwgT2JqZWN0SWQgZXhwZWN0ZWRPbGRPYmplY3RJZCkKKwlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKFJlcG9zaXRvcnkgbG9jYWxEYiwgU3RyaW5nIHNyY1JlZiwgU3RyaW5nIHJlbW90ZU5hbWUsCisJCQlib29sZWFuIGZvcmNlVXBkYXRlLCBTdHJpbmcgbG9jYWxOYW1lLCBPYmplY3RJZCBleHBlY3RlZE9sZE9iamVjdElkKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhpcyhsb2NhbERiLCBzcmNSZWYsIHNyY1JlZiAhPSBudWxsID8gbG9jYWxEYi5yZXNvbHZlKHNyY1JlZikKIAkJCQk6IE9iamVjdElkLnplcm9JZCgpLCByZW1vdGVOYW1lLCBmb3JjZVVwZGF0ZSwgbG9jYWxOYW1lLApAQCAtMjAzLDkgKzIxMCw4IEBAIHB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoZmluYWwgUmVwb3NpdG9yeSBsb2NhbERiLCBmaW5hbCBTdHJpbmcgc3JjUmVmLAogCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIHNvbWUgcmVxdWlyZWQgcGFyYW1ldGVyIHdhcyBudWxsCiAJICovCi0JcHVibGljIFJlbW90ZVJlZlVwZGF0ZShmaW5hbCBSZXBvc2l0b3J5IGxvY2FsRGIsIGZpbmFsIFJlZiBzcmNSZWYsCi0JCQlmaW5hbCBTdHJpbmcgcmVtb3RlTmFtZSwgZmluYWwgYm9vbGVhbiBmb3JjZVVwZGF0ZSwKLQkJCWZpbmFsIFN0cmluZyBsb2NhbE5hbWUsIGZpbmFsIE9iamVjdElkIGV4cGVjdGVkT2xkT2JqZWN0SWQpCisJcHVibGljIFJlbW90ZVJlZlVwZGF0ZShSZXBvc2l0b3J5IGxvY2FsRGIsIFJlZiBzcmNSZWYsIFN0cmluZyByZW1vdGVOYW1lLAorCQkJYm9vbGVhbiBmb3JjZVVwZGF0ZSwgU3RyaW5nIGxvY2FsTmFtZSwgT2JqZWN0SWQgZXhwZWN0ZWRPbGRPYmplY3RJZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRoaXMobG9jYWxEYiwgc3JjUmVmICE9IG51bGwgPyBzcmNSZWYuZ2V0TmFtZSgpIDogbnVsbCwKIAkJCQlzcmNSZWYgIT0gbnVsbCA/IHNyY1JlZi5nZXRPYmplY3RJZCgpIDogbnVsbCwgcmVtb3RlTmFtZSwKQEAgLTI1NSwyOCArMjYxLDQxIEBAIHB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoZmluYWwgUmVwb3NpdG9yeSBsb2NhbERiLCBmaW5hbCBSZWYgc3JjUmVmLAogCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIHNvbWUgcmVxdWlyZWQgcGFyYW1ldGVyIHdhcyBudWxsCiAJICovCi0JcHVibGljIFJlbW90ZVJlZlVwZGF0ZShmaW5hbCBSZXBvc2l0b3J5IGxvY2FsRGIsIGZpbmFsIFN0cmluZyBzcmNSZWYsCi0JCQlmaW5hbCBPYmplY3RJZCBzcmNJZCwgZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUsCi0JCQlmaW5hbCBib29sZWFuIGZvcmNlVXBkYXRlLCBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lLAotCQkJZmluYWwgT2JqZWN0SWQgZXhwZWN0ZWRPbGRPYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHJlbW90ZU5hbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkucmVtb3RlTmFtZUNhbm5vdEJlTnVsbCk7Ci0JCWlmIChzcmNJZCA9PSBudWxsICYmIHNyY1JlZiAhPSBudWxsKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQlKR2l0VGV4dC5nZXQoKS5zb3VyY2VSZWZEb2VzbnRSZXNvbHZlVG9BbnlPYmplY3QsIHNyY1JlZikpOworCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUoUmVwb3NpdG9yeSBsb2NhbERiLCBTdHJpbmcgc3JjUmVmLCBPYmplY3RJZCBzcmNJZCwKKwkJCVN0cmluZyByZW1vdGVOYW1lLCBib29sZWFuIGZvcmNlVXBkYXRlLCBTdHJpbmcgbG9jYWxOYW1lLAorCQkJT2JqZWN0SWQgZXhwZWN0ZWRPbGRPYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdGhpcyhsb2NhbERiLCBzcmNSZWYsIHNyY0lkLCByZW1vdGVOYW1lLCBmb3JjZVVwZGF0ZSwgbG9jYWxOYW1lLCBudWxsLAorCQkJCWV4cGVjdGVkT2xkT2JqZWN0SWQpOworCX0KIAotCQlpZiAoc3JjUmVmICE9IG51bGwpCisJcHJpdmF0ZSBSZW1vdGVSZWZVcGRhdGUoUmVwb3NpdG9yeSBsb2NhbERiLCBTdHJpbmcgc3JjUmVmLCBPYmplY3RJZCBzcmNJZCwKKwkJCVN0cmluZyByZW1vdGVOYW1lLCBib29sZWFuIGZvcmNlVXBkYXRlLCBTdHJpbmcgbG9jYWxOYW1lLAorCQkJQ29sbGVjdGlvbjxSZWZTcGVjPiBmZXRjaFNwZWNzLCBPYmplY3RJZCBleHBlY3RlZE9sZE9iamVjdElkKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGZldGNoU3BlY3MgPT0gbnVsbCkgeworCQkJaWYgKHJlbW90ZU5hbWUgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCQlKR2l0VGV4dC5nZXQoKS5yZW1vdGVOYW1lQ2Fubm90QmVOdWxsKTsKKwkJCX0KKwkJCWlmIChzcmNJZCA9PSBudWxsICYmIHNyY1JlZiAhPSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJSkdpdFRleHQuZ2V0KCkuc291cmNlUmVmRG9lc250UmVzb2x2ZVRvQW55T2JqZWN0LAorCQkJCQkJc3JjUmVmKSk7CisJCQl9CisJCX0KKwkJaWYgKHNyY1JlZiAhPSBudWxsKSB7CiAJCQl0aGlzLnNyY1JlZiA9IHNyY1JlZjsKLQkJZWxzZSBpZiAoc3JjSWQgIT0gbnVsbCAmJiAhc3JjSWQuZXF1YWxzKE9iamVjdElkLnplcm9JZCgpKSkKKwkJfSBlbHNlIGlmIChzcmNJZCAhPSBudWxsICYmICFzcmNJZC5lcXVhbHMoT2JqZWN0SWQuemVyb0lkKCkpKSB7CiAJCQl0aGlzLnNyY1JlZiA9IHNyY0lkLm5hbWUoKTsKLQkJZWxzZQorCQl9IGVsc2UgewogCQkJdGhpcy5zcmNSZWYgPSBudWxsOwotCi0JCWlmIChzcmNJZCAhPSBudWxsKQorCQl9CisJCWlmIChzcmNJZCAhPSBudWxsKSB7CiAJCQl0aGlzLm5ld09iamVjdElkID0gc3JjSWQ7Ci0JCWVsc2UKKwkJfSBlbHNlIHsKIAkJCXRoaXMubmV3T2JqZWN0SWQgPSBPYmplY3RJZC56ZXJvSWQoKTsKLQorCQl9CisJCXRoaXMuZmV0Y2hTcGVjcyA9IGZldGNoU3BlY3M7CiAJCXRoaXMucmVtb3RlTmFtZSA9IHJlbW90ZU5hbWU7CiAJCXRoaXMuZm9yY2VVcGRhdGUgPSBmb3JjZVVwZGF0ZTsKIAkJaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmIGxvY2FsRGIgIT0gbnVsbCkgewpAQCAtMjkyLDggKzMxMSw5IEBAIGVsc2UgaWYgKHNyY0lkICE9IG51bGwgJiYgIXNyY0lkLmVxdWFscyhPYmplY3RJZC56ZXJvSWQoKSkpCiAJCQkJCQk/IGxvY2FsVXBkYXRlLmdldE9sZE9iamVjdElkKCkKIAkJCQkJCTogT2JqZWN0SWQuemVyb0lkKCksCiAJCQkJCW5ld09iamVjdElkKTsKLQkJfSBlbHNlCisJCX0gZWxzZSB7CiAJCQl0cmFja2luZ1JlZlVwZGF0ZSA9IG51bGw7CisJCX0KIAkJdGhpcy5sb2NhbERiID0gbG9jYWxEYjsKIAkJdGhpcy5leHBlY3RlZE9sZE9iamVjdElkID0gZXhwZWN0ZWRPbGRPYmplY3RJZDsKIAkJdGhpcy5zdGF0dXMgPSBTdGF0dXMuTk9UX0FUVEVNUFRFRDsKQEAgLTMxNiwxMSArMzM2LDU3IEBAIGVsc2UgaWYgKHNyY0lkICE9IG51bGwgJiYgIXNyY0lkLmVxdWFscyhPYmplY3RJZC56ZXJvSWQoKSkpCiAJICogICAgICAgICAgICAgbG9jYWwgdHJhY2tpbmcgYnJhbmNoIG9yIHNyY1JlZiBvZiBiYXNlIG9iamVjdCBubyBsb25nZXIgY2FuCiAJICogICAgICAgICAgICAgYmUgcmVzb2x2ZWQgdG8gYW55IG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBiYXNlLAotCQkJZmluYWwgT2JqZWN0SWQgbmV3RXhwZWN0ZWRPbGRPYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcyhiYXNlLmxvY2FsRGIsIGJhc2Uuc3JjUmVmLCBiYXNlLnJlbW90ZU5hbWUsIGJhc2UuZm9yY2VVcGRhdGUsCisJcHVibGljIFJlbW90ZVJlZlVwZGF0ZShSZW1vdGVSZWZVcGRhdGUgYmFzZSwKKwkJCU9iamVjdElkIG5ld0V4cGVjdGVkT2xkT2JqZWN0SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRoaXMoYmFzZS5sb2NhbERiLCBiYXNlLnNyY1JlZiwgYmFzZS5uZXdPYmplY3RJZCwgYmFzZS5yZW1vdGVOYW1lLAorCQkJCWJhc2UuZm9yY2VVcGRhdGUsCiAJCQkJKGJhc2UudHJhY2tpbmdSZWZVcGRhdGUgPT0gbnVsbCA/IG51bGwgOiBiYXNlLnRyYWNraW5nUmVmVXBkYXRlCi0JCQkJCQkuZ2V0TG9jYWxOYW1lKCkpLCBuZXdFeHBlY3RlZE9sZE9iamVjdElkKTsKKwkJCQkJCS5nZXRMb2NhbE5hbWUoKSksCisJCQkJYmFzZS5mZXRjaFNwZWNzLCBuZXdFeHBlY3RlZE9sZE9iamVjdElkKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgInBsYWNlaG9sZGVyIiB1cGRhdGUgZm9yIHRoZSAibWF0Y2hpbmciIFJlZlNwZWMgIjoiLgorCSAqCisJICogQHBhcmFtIGxvY2FsRGIKKwkgKiAgICAgICAgICAgIGxvY2FsIHJlcG9zaXRvcnkgdG8gcHVzaCBmcm9tCisJICogQHBhcmFtIGZvcmNlVXBkYXRlCisJICogICAgICAgICAgICB3aGV0aGVyIG5vbi1mYXN0LWZvcndhcmQgdXBkYXRlcyBzaGFsbCBiZSBhbGxvd2VkCisJICogQHBhcmFtIGZldGNoU3BlY3MKKwkgKiAgICAgICAgICAgIFRoZSBmZXRjaCB7QGxpbmsgUmVmU3BlY31zIHRvIHVzZSB3aGVuIHRoaXMgcGxhY2Vob2xkZXIgaXMKKwkgKiAgICAgICAgICAgIGV4cGFuZGVkIHRvIGRldGVybWluZSByZW1vdGUgdHJhY2tpbmcgYnJhbmNoIHVwZGF0ZXMKKwkgKi8KKwlSZW1vdGVSZWZVcGRhdGUoUmVwb3NpdG9yeSBsb2NhbERiLCBib29sZWFuIGZvcmNlVXBkYXRlLAorCQkJQE5vbk51bGwgQ29sbGVjdGlvbjxSZWZTcGVjPiBmZXRjaFNwZWNzKSB7CisJCXRoaXMubG9jYWxEYiA9IGxvY2FsRGI7CisJCXRoaXMuZm9yY2VVcGRhdGUgPSBmb3JjZVVwZGF0ZTsKKwkJdGhpcy5mZXRjaFNwZWNzID0gZmV0Y2hTcGVjczsKKwkJdGhpcy50cmFja2luZ1JlZlVwZGF0ZSA9IG51bGw7CisJCXRoaXMuc3JjUmVmID0gbnVsbDsKKwkJdGhpcy5yZW1vdGVOYW1lID0gbnVsbDsKKwkJdGhpcy5uZXdPYmplY3RJZCA9IG51bGw7CisJCXRoaXMuc3RhdHVzID0gU3RhdHVzLk5PVF9BVFRFTVBURUQ7CisJfQorCisJLyoqCisJICogVGVsbHMgd2hldGhlciB0aGlzIHtAbGluayBSZW1vdGVSZWZVcGRhdGV9IGlzIGEgcGxhY2Vob2xkZXIgZm9yIGEKKwkgKiAibWF0Y2hpbmciIHtAbGluayBSZWZTcGVjfS4KKwkgKgorCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgaXMgYSBwbGFjZWhvbGRlciwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIGJvb2xlYW4gaXNNYXRjaGluZygpIHsKKwkJcmV0dXJuIGZldGNoU3BlY3MgIT0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIGZldGNoIHtAbGluayBSZWZTcGVjfXMgb2YgdGhpcyB7QGxpbmsgUmVtb3RlUmVmVXBkYXRlfS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGZldGNoIHtAbGluayBSZWZTcGVjfXMsIG9yIHtAY29kZSBudWxsfSBpZgorCSAqICAgICAgICAge0Bjb2RlIHRoaXMufXtAbGluayAjaXNNYXRjaGluZygpfSB7QGNvZGUgPT0gZmFsc2V9CisJICovCisJQ29sbGVjdGlvbjxSZWZTcGVjPiBnZXRGZXRjaFNwZWNzKCkgeworCQlyZXR1cm4gZmV0Y2hTcGVjczsKIAl9CiAKIAkvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaENvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoQ29uc3RhbnRzLmphdmEKaW5kZXggMjEyYTRlNC4uNDhjYWNmMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE4LCAyMDIwIFRob21hcyBXb2xmIDx0aG9tYXMud29sZkBwYXJhbm9yLmNoPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgsIDIwMjEgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTQ0LDYgKzQ0LDE0IEBAIHByaXZhdGUgU3NoQ29uc3RhbnRzKCkgewogCiAJLy8gQ29uZmlnIGZpbGUga2V5cwogCisJLyoqCisJICogUHJvcGVydHkgdG8gY29udHJvbCB3aGV0aGVyIHByaXZhdGUga2V5cyBhcmUgYWRkZWQgdG8gYW4gU1NIIGFnZW50LCBpZgorCSAqIG9uZSBpcyBydW5uaW5nLCBhZnRlciBoYXZpbmcgYmVlbiBsb2FkZWQuCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0tFWVNfVE9fQUdFTlQgPSAiQWRkS2V5c1RvQWdlbnQiOworCiAJLyoqIEtleSBpbiBhbiBzc2ggY29uZmlnIGZpbGUuICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFUQ0hfTU9ERSA9ICJCYXRjaE1vZGUiOwogCkBAIC02Miw2ICs3MCwxNSBAQCBwcml2YXRlIFNzaENvbnN0YW50cygpIHsKIAkvKiogS2V5IGluIGFuIHNzaCBjb25maWcgZmlsZS4gKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX0FUVEVNUFRTID0gIkNvbm5lY3Rpb25BdHRlbXB0cyI7CiAKKwkvKioKKwkgKiBBbiBPcGVuU1NIIHRpbWUgdmFsdWUgZm9yIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQuIEluIE9wZW5TU0gsIHRoaXMKKwkgKiBpbmNsdWRlcyBldmVyeXRoaW5nIHVudGlsIHRoZSBlbmQgb2YgdGhlIGluaXRpYWwga2V5IGV4Y2hhbmdlOyBpbiBKR2l0IGl0CisJICogY292ZXJzIG9ubHkgdGhlIHVuZGVybHlpbmcgVENQIGNvbm5lY3QuCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVF9USU1FT1VUID0gIkNvbm5lY3RUaW1lb3V0IjsKKwogCS8qKiBLZXkgaW4gYW4gc3NoIGNvbmZpZyBmaWxlLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xfUEFUSCA9ICJDb250cm9sUGF0aCI7CiAKQEAgLTE1OSw2ICsxNzYsMTQgQEAgcHJpdmF0ZSBTc2hDb25zdGFudHMoKSB7CiAJLyoqIEtleSBpbiBhbiBzc2ggY29uZmlnIGZpbGUuICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX0ZPUldBUkQgPSAiUmVtb3RlRm9yd2FyZCI7CiAKKwkvKioKKwkgKiAoQWJzb2x1dGUpIHBhdGggdG8gYSBtaWRkbGV3YXJlIGxpYnJhcnkgdGhlIFNTSCBhZ2VudCBzaGFsbCB1c2UgdG8gbG9hZAorCSAqIFNLIChVMkYpIGtleXMuCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDVVJJVFlfS0VZX1BST1ZJREVSID0gIlNlY3VyaXR5S2V5UHJvdmlkZXIiOworCiAJLyoqIEtleSBpbiBhbiBzc2ggY29uZmlnIGZpbGUuICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VORF9FTlYgPSAiU2VuZEVudiI7CiAKQEAgLTIyOSw0ICsyNTQsMTIgQEAgcHJpdmF0ZSBTc2hDb25zdGFudHMoKSB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0lERU5USVRJRVMgPSB7IC8vCiAJCQlJRF9SU0EsIElEX0RTQSwgSURfRUNEU0EsIElEX0VEMjU1MTkKIAl9OworCisJLyoqCisJICogTmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaG9sZGluZyB0aGUgVW5peCBkb21haW4gc29ja2V0IGZvcgorCSAqIGNvbW11bmljYXRpb24gd2l0aCBhbiBTU0ggYWdlbnQuCisJICoKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5WX1NTSF9BVVRIX1NPQ0tFVCA9ICJTU0hfQVVUSF9TT0NLIjsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYWNraW5nUmVmVXBkYXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFja2luZ1JlZlVwZGF0ZS5qYXZhCmluZGV4IDY5NmNhN2MuLjUxYmMwN2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYWNraW5nUmVmVXBkYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhY2tpbmdSZWZVcGRhdGUuamF2YQpAQCAtMTIsNiArMTIsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfQUJCUkVWX1NUUklOR19MRU5HVEg7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7CkBAIC0xODQsOSArMTg2LDEzIEBAIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChmb3JjZVVwZGF0ZSkKIAkJCXNiLmFwcGVuZCgiIChmb3JjZWQpIik7CiAJCXNiLmFwcGVuZCgiICIpOwotCQlzYi5hcHBlbmQob2xkT2JqZWN0SWQgPT0gbnVsbCA/ICIiIDogb2xkT2JqZWN0SWQuYWJicmV2aWF0ZSg3KS5uYW1lKCkpOworCQlzYi5hcHBlbmQob2xkT2JqZWN0SWQgPT0gbnVsbCA/ICIiCisJCQkJOiBvbGRPYmplY3RJZC5hYmJyZXZpYXRlKE9CSkVDVF9JRF9BQkJSRVZfU1RSSU5HX0xFTkdUSCkKKwkJCQkJCS5uYW1lKCkpOwogCQlzYi5hcHBlbmQoIi4uIik7Ci0JCXNiLmFwcGVuZChuZXdPYmplY3RJZCA9PSBudWxsID8gIiIgOiBuZXdPYmplY3RJZC5hYmJyZXZpYXRlKDcpLm5hbWUoKSk7CisJCXNiLmFwcGVuZChuZXdPYmplY3RJZCA9PSBudWxsID8gIiIKKwkJCQk6IG5ld09iamVjdElkLmFiYnJldmlhdGUoT0JKRUNUX0lEX0FCQlJFVl9TVFJJTkdfTEVOR1RIKQorCQkJCQkJLm5hbWUoKSk7CiAJCXNiLmFwcGVuZCgiXSIpOwogCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydC5qYXZhCmluZGV4IDViNzgxYWMuLjBlYWI0NDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydC5qYXZhCkBAIC0yLDcgKzIsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEdvb2dsZSBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIE1hcmVrIFphd2lyc2tpIDxtYXJlay56YXdpcnNraUBnbWFpbC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFJvYmluIFJvc2VuYmVyZyA8cm9iaW4ucm9zZW5iZXJnQGRld2lyZS5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMjAgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiBhbmQgb3RoZXJzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMjIgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC00MCw3ICs0MCw2IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob3RTdXBwb3J0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaG9va3MuSG9va3M7CkBAIC01OTAsNiArNTg5LDExIEBAIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxSZW1vdGVSZWZVcGRhdGU+IGZpbmRSZW1vdGVSZWZVcGRhdGVzRm9yKAogCQlmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IHByb2NSZWZzID0gZXhwYW5kUHVzaFdpbGRjYXJkc0ZvcihkYiwgc3BlY3MpOwogCiAJCWZvciAoUmVmU3BlYyBzcGVjIDogcHJvY1JlZnMpIHsKKwkJCWlmIChzcGVjLmlzTWF0Y2hpbmcoKSkgeworCQkJCXJlc3VsdC5hZGQobmV3IFJlbW90ZVJlZlVwZGF0ZShkYiwgc3BlYy5pc0ZvcmNlVXBkYXRlKCksCisJCQkJCQlmZXRjaFNwZWNzKSk7CisJCQkJY29udGludWU7CisJCQl9CiAJCQlTdHJpbmcgc3JjU3BlYyA9IHNwZWMuZ2V0U291cmNlKCk7CiAJCQlmaW5hbCBSZWYgc3JjUmVmID0gZGIuZmluZFJlZihzcmNTcGVjKTsKIAkJCWlmIChzcmNSZWYgIT0gbnVsbCkKQEAgLTY1NiwxNCArNjYwLDE4IEBAIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxSZW1vdGVSZWZVcGRhdGU+IGZpbmRSZW1vdGVSZWZVcGRhdGVzRm9yKAogCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248UmVmU3BlYz4gZXhwYW5kUHVzaFdpbGRjYXJkc0ZvcigKIAkJCWZpbmFsIFJlcG9zaXRvcnkgZGIsIGZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gc3BlY3MpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBMaXN0PFJlZj4gbG9jYWxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CiAJCWZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gcHJvY1JlZnMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CiAKKwkJTGlzdDxSZWY+IGxvY2FsUmVmcyA9IG51bGw7CiAJCWZvciAoUmVmU3BlYyBzcGVjIDogc3BlY3MpIHsKLQkJCWlmIChzcGVjLmlzV2lsZGNhcmQoKSkgeworCQkJaWYgKCFzcGVjLmlzTWF0Y2hpbmcoKSAmJiBzcGVjLmlzV2lsZGNhcmQoKSkgeworCQkJCWlmIChsb2NhbFJlZnMgPT0gbnVsbCkgeworCQkJCQlsb2NhbFJlZnMgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKTsKKwkJCQl9CiAJCQkJZm9yIChSZWYgbG9jYWxSZWYgOiBsb2NhbFJlZnMpIHsKLQkJCQkJaWYgKHNwZWMubWF0Y2hTb3VyY2UobG9jYWxSZWYpKQorCQkJCQlpZiAoc3BlYy5tYXRjaFNvdXJjZShsb2NhbFJlZikpIHsKIAkJCQkJCXByb2NSZWZzLmFkZChzcGVjLmV4cGFuZEZyb21Tb3VyY2UobG9jYWxSZWYpKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJcHJvY1JlZnMuYWRkKHNwZWMpOwpAQCAtNjcyLDcgKzY4MCw3IEBAIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248UmVmU3BlYz4gZXhwYW5kUHVzaFdpbGRjYXJkc0ZvcigKIAkJcmV0dXJuIHByb2NSZWZzOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kVHJhY2tpbmdSZWZOYW1lKGZpbmFsIFN0cmluZyByZW1vdGVOYW1lLAorCXN0YXRpYyBTdHJpbmcgZmluZFRyYWNraW5nUmVmTmFtZShmaW5hbCBTdHJpbmcgcmVtb3RlTmFtZSwKIAkJCWZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gZmV0Y2hTcGVjcykgewogCQkvLyB0cnkgdG8gZmluZCBtYXRjaGluZyB0cmFja2luZyByZWZzCiAJCWZvciAoUmVmU3BlYyBmZXRjaFNwZWMgOiBmZXRjaFNwZWNzKSB7CkBAIC0xMzcxLDE2ICsxMzc5LDkgQEAgcHVibGljIFB1c2hSZXN1bHQgcHVzaChmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJCWlmICh0b1B1c2guaXNFbXB0eSgpKQogCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkubm90aGluZ1RvUHVzaCk7CiAJCX0KLQkJaWYgKHByZVB1c2ggIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlwcmVQdXNoLnNldFJlZnModG9QdXNoKTsKLQkJCQlwcmVQdXNoLmNhbGwoKTsKLQkJCX0gY2F0Y2ggKEFib3J0ZWRCeUhvb2tFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KIAotCQlmaW5hbCBQdXNoUHJvY2VzcyBwdXNoUHJvY2VzcyA9IG5ldyBQdXNoUHJvY2Vzcyh0aGlzLCB0b1B1c2gsIG91dCk7CisJCWZpbmFsIFB1c2hQcm9jZXNzIHB1c2hQcm9jZXNzID0gbmV3IFB1c2hQcm9jZXNzKHRoaXMsIHRvUHVzaCwgcHJlUHVzaCwKKwkJCQlvdXQpOwogCQlyZXR1cm4gcHVzaFByb2Nlc3MuZXhlY3V0ZShtb25pdG9yKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2suamF2YQppbmRleCBkOWY5ZWRkLi5mOWI1ZWFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFjay5qYXZhCkBAIC0yMzU3LDcgKzIzNTcsNyBAQCBlbHNlIGlmIChyZWYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKQogCQkJCQkJOiByZXEuZ2V0RGVwdGgoKSAtIDE7CiAJCQkJcHcuc2V0U2hhbGxvd1BhY2socmVxLmdldERlcHRoKCksIHVuc2hhbGxvd0NvbW1pdHMpOwogCi0JCQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gT3duZXJzaGlwIGlzIHRyYW5zZmVycmVkIGJlbG93CisJCQkJLy8gT3duZXJzaGlwIGlzIHRyYW5zZmVycmVkIGJlbG93CiAJCQkJRGVwdGhXYWxrLlJldldhbGsgZHcgPSBuZXcgRGVwdGhXYWxrLlJldldhbGsoCiAJCQkJCQl3YWxrLmdldE9iamVjdFJlYWRlcigpLCB3YWxrRGVwdGgpOwogCQkJCWR3LnNldERlZXBlblNpbmNlKHJlcS5nZXREZWVwZW5TaW5jZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3Jlc29sdmVyL0ZpbGVSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEKaW5kZXggM2QxNWVmNS4uMDQ2ZjM5NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAsIEdvb2dsZSBJbmMuIGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDIyLCBHb29nbGUgSW5jLiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0xOCwxMSArMTgsMTEgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5Q2FjaGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeUNhY2hlLkZpbGVLZXk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TdHJpbmdVdGlsczsKIAogLyoqCiAgKiBEZWZhdWx0IHJlc29sdmVyIHNlcnZpbmcgZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbS4KQEAgLTY3LDcgKzY3LDcgQEAgcHVibGljIFJlcG9zaXRvcnkgb3BlbihDIHJlcSwgU3RyaW5nIG5hbWUpCiAJCWlmIChpc1VucmVhc29uYWJsZU5hbWUobmFtZSkpCiAJCQl0aHJvdyBuZXcgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwogCi0JCVJlcG9zaXRvcnkgZGIgPSBleHBvcnRzLmdldChuYW1lV2l0aERvdEdpdChuYW1lKSk7CisJCVJlcG9zaXRvcnkgZGIgPSBleHBvcnRzLmdldChTdHJpbmdVdGlscy5uYW1lV2l0aERvdEdpdChuYW1lKSk7CiAJCWlmIChkYiAhPSBudWxsKSB7CiAJCQlkYi5pbmNyZW1lbnRPcGVuKCk7CiAJCQlyZXR1cm4gZGI7CkBAIC0xNTQsNyArMTU0LDcgQEAgcHVibGljIHZvaWQgc2V0RXhwb3J0QWxsKGJvb2xlYW4gZXhwb3J0KSB7CiAJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSBpbnN0YW5jZS4KIAkgKi8KIAlwdWJsaWMgdm9pZCBleHBvcnRSZXBvc2l0b3J5KFN0cmluZyBuYW1lLCBSZXBvc2l0b3J5IGRiKSB7Ci0JCWV4cG9ydHMucHV0KG5hbWVXaXRoRG90R2l0KG5hbWUpLCBkYik7CisJCWV4cG9ydHMucHV0KFN0cmluZ1V0aWxzLm5hbWVXaXRoRG90R2l0KG5hbWUpLCBkYik7CiAJfQogCiAJLyoqCkBAIC0xOTcsMTIgKzE5Nyw2IEBAIGVsc2UgaWYgKGRiLmdldERpcmVjdG9yeSgpICE9IG51bGwpCiAJCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5hbWVXaXRoRG90R2l0KFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lLmVuZHNXaXRoKENvbnN0YW50cy5ET1RfR0lUX0VYVCkpCi0JCQlyZXR1cm4gbmFtZTsKLQkJcmV0dXJuIG5hbWUgKyBDb25zdGFudHMuRE9UX0dJVF9FWFQ7Ci0JfQotCiAJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VucmVhc29uYWJsZU5hbWUoU3RyaW5nIG5hbWUpIHsKIAkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKIAkJCXJldHVybiB0cnVlOyAvLyBubyBlbXB0eSBwYXRocwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9UcmVlV2Fsay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9UcmVlV2Fsay5qYXZhCmluZGV4IDFmNjE0ZTMuLjgyNjk2NjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvVHJlZVdhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEKQEAgLTEsNiArMSw2IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDksIEdvb2dsZSBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMjIgU2hhd24gTy4gUGVhcmNlIDxzcGVhcmNlQHNwZWFyY2Uub3JnPiBhbmQgb3RoZXJzCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCw2ICsxNCw3IEBACiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CkBAIC03Myw2ICs3NCw3IEBACiAgKiB0aHJlYWRzLgogICovCiBwdWJsaWMgY2xhc3MgVHJlZVdhbGsgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlLCBBdHRyaWJ1dGVzUHJvdmlkZXIgeworCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3JbXSBOT19UUkVFUyA9IHt9OwogCiAJLyoqCkBAIC05Miw3ICs5NCw3IEBAIHB1YmxpYyBlbnVtIE9wZXJhdGlvblR5cGUgewogCX0KIAogCS8qKgotCSAqICAgICAgICAgICAgVHlwZSBvZiBvcGVyYXRpb24geW91IHdhbnQgdG8gcmV0cmlldmUgdGhlIGdpdCBhdHRyaWJ1dGVzIGZvci4KKwkgKiBUeXBlIG9mIG9wZXJhdGlvbiB5b3Ugd2FudCB0byByZXRyaWV2ZSB0aGUgZ2l0IGF0dHJpYnV0ZXMgZm9yLgogCSAqLwogCXByaXZhdGUgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlID0gT3BlcmF0aW9uVHlwZS5DSEVDS09VVF9PUDsKIApAQCAtMjg0LDExICsyODYsMjAgQEAgcHVibGljIHN0YXRpYyBUcmVlV2FsayBmb3JQYXRoKGZpbmFsIFJlcG9zaXRvcnkgZGIsIGZpbmFsIFN0cmluZyBwYXRoLAogCiAJQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3VycmVudEhlYWQ7CiAKLQkvKiogQ2FjaGVkIGF0dHJpYnV0ZSBmb3IgdGhlIGN1cnJlbnQgZW50cnkgKi8KLQlwcml2YXRlIEF0dHJpYnV0ZXMgYXR0cnMgPSBudWxsOworCS8qKgorCSAqIENhY2hlZCBhdHRyaWJ1dGVzIGZvciB0aGUgY3VycmVudCBlbnRyeTsgcGVyIHRyZWUuIEluZGV4IGkrMSBpcyBmb3IgdHJlZQorCSAqIGk7IGluZGV4IDAgaXMgZm9yIHRoZSBkZXByZWNhdGVkIGxlZ2FjeSBiZWhhdmlvci4KKwkgKi8KKwlwcml2YXRlIEF0dHJpYnV0ZXNbXSBhdHRyczsKIAotCS8qKiBDYWNoZWQgYXR0cmlidXRlcyBoYW5kbGVyICovCi0JcHJpdmF0ZSBBdHRyaWJ1dGVzSGFuZGxlciBhdHRyaWJ1dGVzSGFuZGxlcjsKKwkvKioKKwkgKiBDYWNoZWQgYXR0cmlidXRlcyBoYW5kbGVyOyBwZXIgdHJlZS4gSW5kZXggaSsxIGlzIGZvciB0cmVlIGk7IGluZGV4IDAgaXMKKwkgKiBmb3IgdGhlIGRlcHJlY2F0ZWQgbGVnYWN5IGJlaGF2aW9yLgorCSAqLworCXByaXZhdGUgQXR0cmlidXRlc0hhbmRsZXJbXSBhdHRyaWJ1dGVzSGFuZGxlcnM7CisKKwkvKiogQ2FuIGJlIHNldCB0byBpZGVudGlmeSB0aGUgdHJlZSB0byB1c2UgZm9yIHtAbGluayAjZ2V0QXR0cmlidXRlcygpfS4gKi8KKwlwcml2YXRlIGludCBoZWFkSW5kZXggPSAtMTsKIAogCXByaXZhdGUgQ29uZmlnIGNvbmZpZzsKIApAQCAtNTE1LDYgKzUyNiwyNCBAQCBwdWJsaWMgQXR0cmlidXRlc05vZGVQcm92aWRlciBnZXRBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyKCkgewogCX0KIAogCS8qKgorCSAqIElkZW50aWZpZXMgdGhlIHRyZWUgYXQgdGhlIGdpdmVuIGluZGV4IGFzIHRoZSBoZWFkIHRyZWUuIFRoaXMgaXMgdGhlIHRyZWUKKwkgKiB1c2UgYnkgZGVmYXVsdCB0byBkZXRlcm1pbmUgYXR0cmlidXRlcyBhbmQgRU9MIG1vZGVzLgorCSAqCisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICBvZiB0aGUgdHJlZSB0byB1c2UgYXMgaGVhZAorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZQorCSAqIEBzaW5jZSA2LjEKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRIZWFkKGludCBpbmRleCkgeworCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRyZWVzLmxlbmd0aCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSGVhZCBpbmRleCAiICsgaW5kZXggLy8kTk9OLU5MUy0xJAorCQkJCQkrICIgb3V0IG9mIHJhbmdlIFswLCIgKyB0cmVlcy5sZW5ndGggKyAnKScpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaGVhZEluZGV4ID0gaW5kZXg7CisJfQorCisJLyoqCiAJICoge0Bpbmhlcml0RG9jfQogCSAqIDxwPgogCSAqIFJldHJpZXZlIHRoZSBnaXQgYXR0cmlidXRlcyBmb3IgdGhlIGN1cnJlbnQgZW50cnkuCkBAIC01NTYsMjUgKzU4NSw1MSBAQCBwdWJsaWMgQXR0cmlidXRlc05vZGVQcm92aWRlciBnZXRBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyKCkgewogCSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRycyAhPSBudWxsKQotCQkJcmV0dXJuIGF0dHJzOworCQlyZXR1cm4gZ2V0QXR0cmlidXRlcyhoZWFkSW5kZXgpOworCX0KIAorCS8qKgorCSAqIFJldHJpZXZlcyB0aGUgZ2l0IGF0dHJpYnV0ZXMgYmFzZWQgb24gdGhlIGdpdmVuIHRyZWUuCisJICoKKwkgKiBAcGFyYW0gaW5kZXgKKwkgKiAgICAgICAgICAgIG9mIHRoZSB0cmVlIHRvIHVzZSBhcyBiYXNlIGZvciB0aGUgYXR0cmlidXRlcworCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZXMKKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcyhpbnQgaW5kZXgpIHsKKwkJaW50IGF0dHJJbmRleCA9IGluZGV4ICsgMTsKKwkJQXR0cmlidXRlcyByZXN1bHQgPSBhdHRyc1thdHRySW5kZXhdOworCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KIAkJaWYgKGF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJLy8gVGhlIHdvcmsgdHJlZSBzaG91bGQgaGF2ZSBhIEF0dHJpYnV0ZXNOb2RlUHJvdmlkZXIgdG8gYmUgYWJsZSB0bwotCQkJLy8gcmV0cmlldmUgdGhlIGluZm8gYW5kIGdsb2JhbCBhdHRyaWJ1dGVzIG5vZGUKIAkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAJCQkJCSJUaGUgdHJlZSB3YWxrIHNob3VsZCBoYXZlIG9uZSBBdHRyaWJ1dGVzTm9kZVByb3ZpZGVyIHNldCBpbiBvcmRlciB0byBjb21wdXRlIHRoZSBnaXQgYXR0cmlidXRlcy4iKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAKIAkJdHJ5IHsKLQkJCS8vIExhenkgY3JlYXRlIHRoZSBhdHRyaWJ1dGVzSGFuZGxlciBvbiB0aGUgZmlyc3QgYWNjZXNzIG9mCi0JCQkvLyBhdHRyaWJ1dGVzLiBUaGlzIHJlcXVpcmVzIHRoZSBpbmZvLCBnbG9iYWwgYW5kIHJvb3QKLQkJCS8vIGF0dHJpYnV0ZXMgbm9kZXMKLQkJCWlmIChhdHRyaWJ1dGVzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJYXR0cmlidXRlc0hhbmRsZXIgPSBuZXcgQXR0cmlidXRlc0hhbmRsZXIodGhpcyk7CisJCQlBdHRyaWJ1dGVzSGFuZGxlciBoYW5kbGVyID0gYXR0cmlidXRlc0hhbmRsZXJzW2F0dHJJbmRleF07CisJCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7CisJCQkJaWYgKGluZGV4IDwgMCkgeworCQkJCQkvLyBMZWdhY3kgYmVoYXZpb3IgKGhlYWRJbmRleCBub3Qgc2V0LCBnZXRBdHRyaWJ1dGVzKCkgYWJvdmUKKwkJCQkJLy8gY2FsbGVkKQorCQkJCQloYW5kbGVyID0gbmV3IEF0dHJpYnV0ZXNIYW5kbGVyKHRoaXMsICgpIC0+IHsKKwkJCQkJCXJldHVybiBnZXRUcmVlKENhbm9uaWNhbFRyZWVQYXJzZXIuY2xhc3MpOworCQkJCQl9KTsKKwkJCQl9IGVsc2UgeworCQkJCQloYW5kbGVyID0gbmV3IEF0dHJpYnV0ZXNIYW5kbGVyKHRoaXMsICgpIC0+IHsKKwkJCQkJCUFic3RyYWN0VHJlZUl0ZXJhdG9yIHRyZWUgPSB0cmVlc1tpbmRleF07CisJCQkJCQlpZiAodHJlZSBpbnN0YW5jZW9mIENhbm9uaWNhbFRyZWVQYXJzZXIpIHsKKwkJCQkJCQlyZXR1cm4gKENhbm9uaWNhbFRyZWVQYXJzZXIpIHRyZWU7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfSk7CisJCQkJfQorCQkJCWF0dHJpYnV0ZXNIYW5kbGVyc1thdHRySW5kZXhdID0gaGFuZGxlcjsKIAkJCX0KLQkJCWF0dHJzID0gYXR0cmlidXRlc0hhbmRsZXIuZ2V0QXR0cmlidXRlcygpOwotCQkJcmV0dXJuIGF0dHJzOworCQkJcmVzdWx0ID0gaGFuZGxlci5nZXRBdHRyaWJ1dGVzKCk7CisJCQlhdHRyc1thdHRySW5kZXhdID0gcmVzdWx0OworCQkJcmV0dXJuIHJlc3VsdDsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IEpHaXRJbnRlcm5hbEV4Y2VwdGlvbigiRXJyb3Igd2hpbGUgcGFyc2luZyBhdHRyaWJ1dGVzIiwgLy8kTk9OLU5MUy0xJAogCQkJCQllKTsKQEAgLTU5NSwxMSArNjUwLDM0IEBAIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB7CiAJICovCiAJQE51bGxhYmxlCiAJcHVibGljIEVvbFN0cmVhbVR5cGUgZ2V0RW9sU3RyZWFtVHlwZShPcGVyYXRpb25UeXBlIG9wVHlwZSkgewotCQlpZiAoYXR0cmlidXRlc05vZGVQcm92aWRlciA9PSBudWxsIHx8IGNvbmZpZyA9PSBudWxsKQorCQlpZiAoYXR0cmlidXRlc05vZGVQcm92aWRlciA9PSBudWxsIHx8IGNvbmZpZyA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIEVvbFN0cmVhbVR5cGVVdGlsLmRldGVjdFN0cmVhbVR5cGUoCi0JCQkJb3BUeXBlICE9IG51bGwgPyBvcFR5cGUgOiBvcGVyYXRpb25UeXBlLAotCQkJCQljb25maWcuZ2V0KFdvcmtpbmdUcmVlT3B0aW9ucy5LRVkpLCBnZXRBdHRyaWJ1dGVzKCkpOworCQl9CisJCU9wZXJhdGlvblR5cGUgb3AgPSBvcFR5cGUgIT0gbnVsbCA/IG9wVHlwZSA6IG9wZXJhdGlvblR5cGU7CisJCXJldHVybiBFb2xTdHJlYW1UeXBlVXRpbC5kZXRlY3RTdHJlYW1UeXBlKG9wLAorCQkJCWNvbmZpZy5nZXQoV29ya2luZ1RyZWVPcHRpb25zLktFWSksIGdldEF0dHJpYnV0ZXMoKSk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBFT0wgc3RyZWFtIHR5cGUgb2YgdGhlIGN1cnJlbnQgZW50cnkgZm9yIGNoZWNraW5nIG91dCB1c2luZyB0aGUKKwkgKiBjb25maWcgYW5kIHtAbGluayAjZ2V0QXR0cmlidXRlcygpfS4KKwkgKgorCSAqIEBwYXJhbSB0cmVlCisJICogICAgICAgICAgICBpbmRleCBvZiB0aGUgdHJlZSB0aGUgY2hlY2stb3V0IGlzIHRvIGJlIGZyb20KKwkgKiBAcmV0dXJuIHRoZSBFT0wgc3RyZWFtIHR5cGUgb2YgdGhlIGN1cnJlbnQgZW50cnkgdXNpbmcgdGhlIGNvbmZpZyBhbmQKKwkgKiAgICAgICAgIHtAbGluayAjZ2V0QXR0cmlidXRlcygpfS4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbAorCSAqICAgICAgICAgaWYgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrfSBpcyBub3QgYmFzZWQgb24KKwkgKiAgICAgICAgIGEgd29ya2luZyB0cmVlCisJICogQHNpbmNlIDYuMQorCSAqLworCUBOdWxsYWJsZQorCXB1YmxpYyBFb2xTdHJlYW1UeXBlIGdldENoZWNrb3V0RW9sU3RyZWFtVHlwZShpbnQgdHJlZSkgeworCQlpZiAoYXR0cmlidXRlc05vZGVQcm92aWRlciA9PSBudWxsIHx8IGNvbmZpZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlBdHRyaWJ1dGVzIGF0dHIgPSBnZXRBdHRyaWJ1dGVzKHRyZWUpOworCQlyZXR1cm4gRW9sU3RyZWFtVHlwZVV0aWwuZGV0ZWN0U3RyZWFtVHlwZShPcGVyYXRpb25UeXBlLkNIRUNLT1VUX09QLAorCQkJCWNvbmZpZy5nZXQoV29ya2luZ1RyZWVPcHRpb25zLktFWSksIGF0dHIpOwogCX0KIAogCS8qKgpAQCAtNjA3LDcgKzY4NSw4IEBAIHB1YmxpYyBFb2xTdHJlYW1UeXBlIGdldEVvbFN0cmVhbVR5cGUoT3BlcmF0aW9uVHlwZSBvcFR5cGUpIHsKIAkgKi8KIAlwdWJsaWMgdm9pZCByZXNldCgpIHsKIAkJYXR0cnMgPSBudWxsOwotCQlhdHRyaWJ1dGVzSGFuZGxlciA9IG51bGw7CisJCWF0dHJpYnV0ZXNIYW5kbGVycyA9IG51bGw7CisJCWhlYWRJbmRleCA9IC0xOwogCQl0cmVlcyA9IE5PX1RSRUVTOwogCQlhZHZhbmNlID0gZmFsc2U7CiAJCWRlcHRoID0gMDsKQEAgLTY1MSw3ICs3MzAsOSBAQCBwdWJsaWMgdm9pZCByZXNldChBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAKIAkJYWR2YW5jZSA9IGZhbHNlOwogCQlkZXB0aCA9IDA7Ci0JCWF0dHJzID0gbnVsbDsKKwkJYXR0cnMgPSBuZXcgQXR0cmlidXRlc1syXTsKKwkJYXR0cmlidXRlc0hhbmRsZXJzID0gbmV3IEF0dHJpYnV0ZXNIYW5kbGVyWzJdOworCQloZWFkSW5kZXggPSAtMTsKIAl9CiAKIAkvKioKQEAgLTcwMSw3ICs3ODIsMTQgQEAgcHVibGljIHZvaWQgcmVzZXQoQW55T2JqZWN0SWQuLi4gaWRzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJdHJlZXMgPSByOwogCQlhZHZhbmNlID0gZmFsc2U7CiAJCWRlcHRoID0gMDsKLQkJYXR0cnMgPSBudWxsOworCQlpZiAob2xkTGVuID09IG5ld0xlbikgeworCQkJQXJyYXlzLmZpbGwoYXR0cnMsIG51bGwpOworCQkJQXJyYXlzLmZpbGwoYXR0cmlidXRlc0hhbmRsZXJzLCBudWxsKTsKKwkJfSBlbHNlIHsKKwkJCWF0dHJzID0gbmV3IEF0dHJpYnV0ZXNbbmV3TGVuICsgMV07CisJCQlhdHRyaWJ1dGVzSGFuZGxlcnMgPSBuZXcgQXR0cmlidXRlc0hhbmRsZXJbbmV3TGVuICsgMV07CisJCX0KKwkJaGVhZEluZGV4ID0gLTE7CiAJfQogCiAJLyoqCkBAIC03NTgsNiArODQ2LDE2IEBAIHB1YmxpYyBpbnQgYWRkVHJlZShBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CiAJCXAubWF0Y2hTaGlmdCA9IDA7CiAKIAkJdHJlZXMgPSBuZXdUcmVlczsKKwkJaWYgKGF0dHJzID09IG51bGwpIHsKKwkJCWF0dHJzID0gbmV3IEF0dHJpYnV0ZXNbbiArIDJdOworCQl9IGVsc2UgeworCQkJYXR0cnMgPSBBcnJheXMuY29weU9mKGF0dHJzLCBuICsgMik7CisJCX0KKwkJaWYgKGF0dHJpYnV0ZXNIYW5kbGVycyA9PSBudWxsKSB7CisJCQlhdHRyaWJ1dGVzSGFuZGxlcnMgPSBuZXcgQXR0cmlidXRlc0hhbmRsZXJbbiArIDJdOworCQl9IGVsc2UgeworCQkJYXR0cmlidXRlc0hhbmRsZXJzID0gQXJyYXlzLmNvcHlPZihhdHRyaWJ1dGVzSGFuZGxlcnMsIG4gKyAyKTsKKwkJfQogCQlyZXR1cm4gbjsKIAl9CiAKQEAgLTgwMCw3ICs4OTgsNyBAQCBwdWJsaWMgYm9vbGVhbiBuZXh0KCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQl9CiAKIAkJCWZvciAoOzspIHsKLQkJCQlhdHRycyA9IG51bGw7CisJCQkJQXJyYXlzLmZpbGwoYXR0cnMsIG51bGwpOwogCQkJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSBtaW4oKTsKIAkJCQlpZiAodC5lb2YoKSkgewogCQkJCQlpZiAoZGVwdGggPiAwKSB7CkBAIC0xMjU1LDcgKzEzNTMsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc1Bvc3RDaGlsZHJlbigpIHsKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbnRlclN1YnRyZWUoKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJYXR0cnMgPSBudWxsOworCQlBcnJheXMuZmlsbChhdHRycywgbnVsbCk7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNoID0gY3VycmVudEhlYWQ7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yW10gdG1wID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yW3RyZWVzLmxlbmd0aF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdHJlZXMubGVuZ3RoOyBpKyspIHsKQEAgLTEzNzQsMTEgKzE0NzIsMTIgQEAgcHVibGljIDxUIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlcmF0b3I+IFQgZ2V0VHJlZShDbGFzczxUPiB0eXBlKSB7CiAKIAkvKioKIAkgKiBJbnNwZWN0IGNvbmZpZyBhbmQgYXR0cmlidXRlcyB0byByZXR1cm4gYSBmaWx0ZXJjb21tYW5kIGFwcGxpY2FibGUgZm9yCi0JICogdGhlIGN1cnJlbnQgcGF0aCwgYnV0IHdpdGhvdXQgZXhwYW5kaW5nICVmIG9jY3VyZW5jZXMKKwkgKiB0aGUgY3VycmVudCBwYXRoLgogCSAqCiAJICogQHBhcmFtIGZpbHRlckNvbW1hbmRUeXBlCiAJICogICAgICAgICAgICB3aGljaCB0eXBlIG9mIGZpbHRlckNvbW1hbmQgc2hvdWxkIGJlIGV4ZWN1dGVkLiBFLmcuICJjbGVhbiIsCi0JICogICAgICAgICAgICAic211ZGdlIgorCSAqICAgICAgICAgICAgInNtdWRnZSIuIEZvciAic211ZGdlIiBjb25zaWRlciB1c2luZworCSAqICAgICAgICAgICAge3tAbGluayAjZ2V0U211ZGdlQ29tbWFuZChpbnQpfSBpbnN0ZWFkLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgY29tbWFuZAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqIEBzaW5jZSA0LjIKQEAgLTE0MDcsNiArMTUwNiw1NCBAQCBwdWJsaWMgU3RyaW5nIGdldEZpbHRlckNvbW1hbmQoU3RyaW5nIGZpbHRlckNvbW1hbmRUeXBlKQogCX0KIAogCS8qKgorCSAqIEluc3BlY3QgY29uZmlnIGFuZCBhdHRyaWJ1dGVzIHRvIHJldHVybiBhIGZpbHRlcmNvbW1hbmQgYXBwbGljYWJsZSBmb3IKKwkgKiB0aGUgY3VycmVudCBwYXRoLgorCSAqCisJICogQHBhcmFtIGluZGV4CisJICogICAgICAgICAgICBvZiB0aGUgdHJlZSB0aGUgaXRlbSB0byBiZSBzbXVkZ2VkIGlzIGluCisJICogQHJldHVybiBhIGZpbHRlciBjb21tYW5kCisJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U211ZGdlQ29tbWFuZChpbnQgaW5kZXgpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gZ2V0U211ZGdlQ29tbWFuZChnZXRBdHRyaWJ1dGVzKGluZGV4KSk7CisJfQorCisJLyoqCisJICogSW5zcGVjdCBjb25maWcgYW5kIGF0dHJpYnV0ZXMgdG8gcmV0dXJuIGEgZmlsdGVyY29tbWFuZCBhcHBsaWNhYmxlIGZvcgorCSAqIHRoZSBjdXJyZW50IHBhdGguCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlcworCSAqICAgICAgICAgICAgdG8gdXNlCisJICogQHJldHVybiBhIGZpbHRlciBjb21tYW5kCisJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogQHNpbmNlIDYuMQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U211ZGdlQ29tbWFuZChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUF0dHJpYnV0ZSBmID0gYXR0cmlidXRlcy5nZXQoQ29uc3RhbnRzLkFUVFJfRklMVEVSKTsKKwkJaWYgKGYgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJU3RyaW5nIGZpbHRlclZhbHVlID0gZi5nZXRWYWx1ZSgpOworCQlpZiAoZmlsdGVyVmFsdWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlTdHJpbmcgZmlsdGVyQ29tbWFuZCA9IGdldEZpbHRlckNvbW1hbmREZWZpbml0aW9uKGZpbHRlclZhbHVlLAorCQkJCUNvbnN0YW50cy5BVFRSX0ZJTFRFUl9UWVBFX1NNVURHRSk7CisJCWlmIChmaWx0ZXJDb21tYW5kID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBmaWx0ZXJDb21tYW5kLnJlcGxhY2VBbGwoIiVmIiwgLy8kTk9OLU5MUy0xJAorCQkJCU1hdGNoZXIucXVvdGVSZXBsYWNlbWVudCgKKwkJCQkJCVF1b3RlZFN0cmluZy5CT1VSTkUucXVvdGUoKGdldFBhdGhTdHJpbmcoKSkpKSk7CisJfQorCisJLyoqCiAJICogR2V0IHRoZSBmaWx0ZXIgY29tbWFuZCBob3cgaXQgaXMgZGVmaW5lZCBpbiBnaXRjb25maWcuIFRoZSByZXR1cm5lZAogCSAqIHN0cmluZyBtYXkgY29udGFpbiAiJWYiIHdoaWNoIG5lZWRzIHRvIGJlIHJlcGxhY2VkIGJ5IHRoZSBjdXJyZW50IHBhdGgKIAkgKiBiZWZvcmUgZXhlY3V0aW5nIHRoZSBmaWx0ZXIgY29tbWFuZC4gVGhlc2UgZmlsdGVyIGRlZmluaXRpb25zIGFyZSBjYWNoZWQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEKaW5kZXggNTBjZTE1ZS4uNDI3ZWFjNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEKQEAgLTIsNyArMiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFNoYXduIE8uIFBlYXJjZSA8c3BlYXJjZUBzcGVhcmNlLm9yZz4KICAqIENvcHlyaWdodCAoQykgMjAxMCwgQ2hyaXN0aWFuIEhhbHN0cmljayA8Y2hyaXN0aWFuLmhhbHN0cmlja0BzYXAuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXR0aGlhcyBTb2huIDxtYXR0aGlhcy5zb2huQHNhcC5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAyMSwgUm9iaW4gUm9zZW5iZXJnIGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAxMiwgMjAyMiwgUm9iaW4gUm9zZW5iZXJnIGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTM4Nyw4ICszODcsOCBAQCBwdWJsaWMgYm9vbGVhbiBpc1dvcmtUcmVlKCkgewogCQkJCXN0YXRlLmluaXRpYWxpemVSZWFkQnVmZmVyKCk7CiAKIAkJCQlmaW5hbCBsb25nIGxlbiA9IGUuZ2V0TGVuZ3RoKCk7Ci0JCQkJSW5wdXRTdHJlYW0gZmlsdGVyZWRJcyA9IHBvc3NpYmx5RmlsdGVyZWRJbnB1dFN0cmVhbShlLCBpcywgbGVuLAotCQkJCQkJT3BlcmF0aW9uVHlwZS5DSEVDS0lOX09QKTsKKwkJCQlJbnB1dFN0cmVhbSBmaWx0ZXJlZElzID0gcG9zc2libHlGaWx0ZXJlZElucHV0U3RyZWFtKGUsIGlzLAorCQkJCQkJbGVuKTsKIAkJCQlyZXR1cm4gY29tcHV0ZUhhc2goZmlsdGVyZWRJcywgY2Fub25MZW4pOwogCQkJfSBmaW5hbGx5IHsKIAkJCQlzYWZlQ2xvc2UoaXMpOwpAQCAtNDAwLDIzICs0MDAsMTggQEAgcHVibGljIGJvb2xlYW4gaXNXb3JrVHJlZSgpIHsKIAl9CiAKIAlwcml2YXRlIElucHV0U3RyZWFtIHBvc3NpYmx5RmlsdGVyZWRJbnB1dFN0cmVhbShmaW5hbCBFbnRyeSBlLAotCQkJZmluYWwgSW5wdXRTdHJlYW0gaXMsIGZpbmFsIGxvbmcgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gcG9zc2libHlGaWx0ZXJlZElucHV0U3RyZWFtKGUsIGlzLCBsZW4sIG51bGwpOwotCi0JfQotCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBwb3NzaWJseUZpbHRlcmVkSW5wdXRTdHJlYW0oZmluYWwgRW50cnkgZSwKLQkJCWZpbmFsIElucHV0U3RyZWFtIGlzLCBmaW5hbCBsb25nIGxlbiwgT3BlcmF0aW9uVHlwZSBvcFR5cGUpCisJCQlmaW5hbCBJbnB1dFN0cmVhbSBpcywgZmluYWwgbG9uZyBsZW4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoZ2V0Q2xlYW5GaWx0ZXJDb21tYW5kKCkgPT0gbnVsbAotCQkJCSYmIGdldEVvbFN0cmVhbVR5cGUob3BUeXBlKSA9PSBFb2xTdHJlYW1UeXBlLkRJUkVDVCkgeworCQkJCSYmIGdldEVvbFN0cmVhbVR5cGUoCisJCQkJCQlPcGVyYXRpb25UeXBlLkNIRUNLSU5fT1ApID09IEVvbFN0cmVhbVR5cGUuRElSRUNUKSB7CiAJCQljYW5vbkxlbiA9IGxlbjsKIAkJCXJldHVybiBpczsKIAkJfQogCiAJCWlmIChsZW4gPD0gTUFYSU1VTV9GSUxFX1NJWkVfVE9fUkVBRF9GVUxMWSkgewogCQkJQnl0ZUJ1ZmZlciByYXdidWYgPSBJTy5yZWFkV2hvbGVTdHJlYW0oaXMsIChpbnQpIGxlbik7Ci0JCQlyYXdidWYgPSBmaWx0ZXJDbGVhbihyYXdidWYuYXJyYXkoKSwgcmF3YnVmLmxpbWl0KCksIG9wVHlwZSk7CisJCQlyYXdidWYgPSBmaWx0ZXJDbGVhbihyYXdidWYuYXJyYXkoKSwgcmF3YnVmLmxpbWl0KCkpOwogCQkJY2Fub25MZW4gPSByYXdidWYubGltaXQoKTsKIAkJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmF3YnVmLmFycmF5KCksIDAsIChpbnQpIGNhbm9uTGVuKTsKIAkJfQpAQCAtNDI2LDE0ICs0MjEsMTMgQEAgJiYgZ2V0RW9sU3RyZWFtVHlwZShvcFR5cGUpID09IEVvbFN0cmVhbVR5cGUuRElSRUNUKSB7CiAJCQkJcmV0dXJuIGlzOwogCQkJfQogCi0JCWZpbmFsIElucHV0U3RyZWFtIGxlbklzID0gZmlsdGVyQ2xlYW4oZS5vcGVuSW5wdXRTdHJlYW0oKSwKLQkJCQlvcFR5cGUpOworCQkJZmluYWwgSW5wdXRTdHJlYW0gbGVuSXMgPSBmaWx0ZXJDbGVhbihlLm9wZW5JbnB1dFN0cmVhbSgpKTsKIAkJdHJ5IHsKIAkJCWNhbm9uTGVuID0gY29tcHV0ZUxlbmd0aChsZW5Jcyk7CiAJCX0gZmluYWxseSB7CiAJCQlzYWZlQ2xvc2UobGVuSXMpOwogCQl9Ci0JCXJldHVybiBmaWx0ZXJDbGVhbihpcywgb3BUeXBlKTsKKwkJcmV0dXJuIGZpbHRlckNsZWFuKGlzKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyB2b2lkIHNhZmVDbG9zZShJbnB1dFN0cmVhbSBpbikgewpAQCAtNDU1LDIzICs0NDksMjAgQEAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0JpbmFyeShFbnRyeSBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgQnl0ZUJ1ZmZlciBmaWx0ZXJDbGVhbihieXRlW10gc3JjLCBpbnQgbiwgT3BlcmF0aW9uVHlwZSBvcFR5cGUpCisJcHJpdmF0ZSBCeXRlQnVmZmVyIGZpbHRlckNsZWFuKGJ5dGVbXSBzcmMsIGludCBuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3JjKTsKIAkJdHJ5IHsKLQkJCXJldHVybiBJTy5yZWFkV2hvbGVTdHJlYW0oZmlsdGVyQ2xlYW4oaW4sIG9wVHlwZSksIG4pOworCQkJcmV0dXJuIElPLnJlYWRXaG9sZVN0cmVhbShmaWx0ZXJDbGVhbihpbiksIG4pOwogCQl9IGZpbmFsbHkgewogCQkJc2FmZUNsb3NlKGluKTsKIAkJfQogCX0KIAotCXByaXZhdGUgSW5wdXRTdHJlYW0gZmlsdGVyQ2xlYW4oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmaWx0ZXJDbGVhbihpbiwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBmaWx0ZXJDbGVhbihJbnB1dFN0cmVhbSBpbiwgT3BlcmF0aW9uVHlwZSBvcFR5cGUpCisJcHJpdmF0ZSBJbnB1dFN0cmVhbSBmaWx0ZXJDbGVhbihJbnB1dFN0cmVhbSBpbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWluID0gaGFuZGxlQXV0b0NSTEYoaW4sIG9wVHlwZSk7CisJCWluID0gRW9sU3RyZWFtVHlwZVV0aWwud3JhcElucHV0U3RyZWFtKGluLAorCQkJCWdldEVvbFN0cmVhbVR5cGUoT3BlcmF0aW9uVHlwZS5DSEVDS0lOX09QKSk7CiAJCVN0cmluZyBmaWx0ZXJDb21tYW5kID0gZ2V0Q2xlYW5GaWx0ZXJDb21tYW5kKCk7CiAJCWlmIChmaWx0ZXJDb21tYW5kICE9IG51bGwpIHsKIAkJCWlmIChGaWx0ZXJDb21tYW5kUmVnaXN0cnkuaXNSZWdpc3RlcmVkKGZpbHRlckNvbW1hbmQpKSB7CkBAIC01MDksMTEgKzUwMCw2IEBAIGZpbHRlckNvbW1hbmQsIGdldEVudHJ5UGF0aFN0cmluZygpLAogCQlyZXR1cm4gaW47CiAJfQogCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBoYW5kbGVBdXRvQ1JMRihJbnB1dFN0cmVhbSBpbiwgT3BlcmF0aW9uVHlwZSBvcFR5cGUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gRW9sU3RyZWFtVHlwZVV0aWwud3JhcElucHV0U3RyZWFtKGluLCBnZXRFb2xTdHJlYW1UeXBlKG9wVHlwZSkpOwotCX0KLQogCS8qKgogCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgdHJlZSBvcHRpb25zIHVzZWQgYnkgdGhpcyBpdGVyYXRvci4KIAkgKgpAQCAtNjY0LDcgKzY1MCw4IEBAIHB1YmxpYyBJbnN0YW50IGdldEVudHJ5TGFzdE1vZGlmaWVkSW5zdGFudCgpIHsKIAlwdWJsaWMgSW5wdXRTdHJlYW0gb3BlbkVudHJ5U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSW5wdXRTdHJlYW0gcmF3aXMgPSBjdXJyZW50KCkub3BlbklucHV0U3RyZWFtKCk7CiAJCWlmIChnZXRDbGVhbkZpbHRlckNvbW1hbmQoKSA9PSBudWxsCi0JCQkJJiYgZ2V0RW9sU3RyZWFtVHlwZSgpID09IEVvbFN0cmVhbVR5cGUuRElSRUNUKSB7CisJCQkJJiYgZ2V0RW9sU3RyZWFtVHlwZSgKKwkJCQkJCU9wZXJhdGlvblR5cGUuQ0hFQ0tJTl9PUCkgPT0gRW9sU3RyZWFtVHlwZS5ESVJFQ1QpIHsKIAkJCXJldHVybiByYXdpczsKIAkJfQogCQlyZXR1cm4gZmlsdGVyQ2xlYW4ocmF3aXMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzIuamF2YQppbmRleCBmZjA5NGY2Li5hZTczZDNmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzIuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVZpc2l0T3B0aW9uOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVZpc2l0UmVzdWx0OwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5MaW5rT3B0aW9uOwogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKIGltcG9ydCBqYXZhLm5pby5maWxlLlNpbXBsZUZpbGVWaXNpdG9yOwogaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkJhc2ljRmlsZUF0dHJpYnV0ZXM7CkBAIC05Niw2ICs5Nyw5IEBAIHB1YmxpYyBib29sZWFuIHJldHJ5RmFpbGVkTG9ja0ZpbGVDb21taXQoKSB7CiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgRW50cnlbXSBsaXN0KEZpbGUgZGlyZWN0b3J5LCBGaWxlTW9kZVN0cmF0ZWd5IGZpbGVNb2RlU3RyYXRlZ3kpIHsKKwkJaWYgKCFGaWxlcy5pc0RpcmVjdG9yeShkaXJlY3RvcnkudG9QYXRoKCksIExpbmtPcHRpb24uTk9GT0xMT1dfTElOS1MpKSB7CisJCQlyZXR1cm4gTk9fRU5UUklFUzsKKwkJfQogCQlMaXN0PEVudHJ5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJRlMgZnMgPSB0aGlzOwogCQlib29sZWFuIGNoZWNrRXhlY3V0YWJsZSA9IGZzLnN1cHBvcnRzRXhlY3V0ZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N0cmluZ1V0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YQppbmRleCA4YWIxMzM4Li45MTdhZGQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgR29vZ2xlIEluYy4gYW5kIG90aGVycworICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMjIsIEdvb2dsZSBJbmMuIGFuZCBvdGhlcnMKICAqCiAgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKICAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKQEAgLTE1LDYgKzE1LDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTm9uTnVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIAogLyoqCiAgKiBNaXNjZWxsYW5lb3VzIHN0cmluZyBjb21wYXJpc29uIHV0aWxpdHkgbWV0aG9kcy4KQEAgLTM3LDYgKzM4LDEwIEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdVdGlscyB7CiAJCQlMQ1tjXSA9IChjaGFyKSAoJ2EnICsgKGMgLSAnQScpKTsKIAl9CiAKKwlwcml2YXRlIFN0cmluZ1V0aWxzKCkgeworCQkvLyBEbyBub3QgY3JlYXRlIGluc3RhbmNlcworCX0KKwogCS8qKgogCSAqIENvbnZlcnQgdGhlIGlucHV0IHRvIGxvd2VyY2FzZS4KIAkgKiA8cD4KQEAgLTI2OSw4ICsyNzQsMjAgQEAgcHVibGljIHN0YXRpYyBTdHJpbmcgam9pbihDb2xsZWN0aW9uPFN0cmluZz4gcGFydHMsIFN0cmluZyBzZXBhcmF0b3IsCiAJCXJldHVybiBzYi50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nVXRpbHMoKSB7Ci0JCS8vIERvIG5vdCBjcmVhdGUgaW5zdGFuY2VzCisJLyoqCisJICogQXBwZW5kcyB7QGxpbmsgQ29uc3RhbnRzI0RPVF9HSVRfRVhUfSB1bmxlc3MgdGhlIGdpdmVuIG5hbWUgYWxyZWFkeSBlbmRzCisJICogd2l0aCB0aGF0IHN1ZmZpeC4KKwkgKgorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICB0byBjb21wbGV0ZQorCSAqIEByZXR1cm4gdGhlIG5hbWUgZW5kaW5nIHdpdGgge0BsaW5rIENvbnN0YW50cyNET1RfR0lUX0VYVH0KKwkgKiBAc2luY2UgNi4xCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZVdpdGhEb3RHaXQoU3RyaW5nIG5hbWUpIHsKKwkJaWYgKG5hbWUuZW5kc1dpdGgoQ29uc3RhbnRzLkRPVF9HSVRfRVhUKSkgeworCQkJcmV0dXJuIG5hbWU7CisJCX0KKwkJcmV0dXJuIG5hbWUgKyBDb25zdGFudHMuRE9UX0dJVF9FWFQ7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQmluYXJ5SHVua0lucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQmluYXJ5SHVua0lucHV0U3RyZWFtLmphdmEKaW5kZXggNGY5NDBkNy4uMmM5NzJiNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0JpbmFyeUh1bmtJbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9CaW5hcnlIdW5rSW5wdXRTdHJlYW0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+IGFuZCBvdGhlcnMKKyAqIENvcHlyaWdodCAoQykgMjAyMSwgMjAyMiBUaG9tYXMgV29sZiA8dGhvbWFzLndvbGZAcGFyYW5vci5jaD4gYW5kIG90aGVycwogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQogICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdApAQCAtOTAsNyArOTAsNyBAQCBwcml2YXRlIHZvaWQgZmlsbEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWJ5dGVbXSBlbmNvZGVkID0gbmV3IGJ5dGVbQmFzZTg1LmVuY29kZWRMZW5ndGgobGVuZ3RoKV07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgZW5jb2RlZC5sZW5ndGg7IGkrKykgewogCQkJaW50IGIgPSBpbi5yZWFkKCk7Ci0JCQlpZiAoYiA8IDAgfHwgYiA9PSAnXG4nKSB7CisJCQlpZiAoYiA8IDAgfHwgYiA9PSAnXHInIHx8IGIgPT0gJ1xuJykgewogCQkJCXRocm93IG5ldyBFT0ZFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCQlKR2l0VGV4dC5nZXQoKS5iaW5hcnlIdW5rSW52YWxpZExlbmd0aCwKIAkJCQkJCUludGVnZXIudmFsdWVPZihsaW5lTnVtYmVyKSkpOwpAQCAtOTksNiArOTksMTAgQEAgcHJpdmF0ZSB2b2lkIGZpbGxCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJCS8vIE11c3QgYmUgZm9sbG93ZWQgYnkgYSBuZXdsaW5lOyB0b2xlcmF0ZSBFT0YuCiAJCWludCBiID0gaW4ucmVhZCgpOworCQlpZiAoYiA9PSAnXHInKSB7CisJCQkvLyBCZSBsZW5pZW50IGFuZCBhY2NlcHQgQ1ItTEYsIHRvby4KKwkJCWIgPSBpbi5yZWFkKCk7CisJCX0KIAkJaWYgKGIgPj0gMCAmJiBiICE9ICdcbicpIHsKIAkJCXRocm93IG5ldyBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmJpbmFyeUh1bmtNaXNzaW5nTmV3bGluZSwKZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCmluZGV4IDFlODM1YTcuLjQ5NjRlZWEgMTAwNjQ0Ci0tLSBhL3BvbS54bWwKKysrIGIvcG9tLnhtbApAQCAtMTgsNyArMTgsNyBAQAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+Ni4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjYuMS4xLVNOQVBTSE9UPC92ZXJzaW9uPgogCiAgIDxuYW1lPkpHaXQgLSBQYXJlbnQ8L25hbWU+CiAgIDx1cmw+JHtqZ2l0LXVybH08L3VybD4KQEAgLTE1MCw5ICsxNTAsOSBAQAogICAgIDxqYXZhLnZlcnNpb24+MTE8L2phdmEudmVyc2lvbj4KICAgICA8YnVuZGxlLW1hbmlmZXN0PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L01FVEEtSU5GL01BTklGRVNULk1GPC9idW5kbGUtbWFuaWZlc3Q+CiAKLSAgICA8amdpdC1sYXN0LXJlbGVhc2UtdmVyc2lvbj41LjEzLjAuMjAyMTA5MDgwODI3LXI8L2pnaXQtbGFzdC1yZWxlYXNlLXZlcnNpb24+CisgICAgPGpnaXQtbGFzdC1yZWxlYXNlLXZlcnNpb24+Ni4wLjAuMjAyMTExMjkxMDAwLXI8L2pnaXQtbGFzdC1yZWxlYXNlLXZlcnNpb24+CiAgICAgPGFudC12ZXJzaW9uPjEuMTAuMTI8L2FudC12ZXJzaW9uPgotICAgIDxhcGFjaGUtc3NoZC12ZXJzaW9uPjIuNy4wPC9hcGFjaGUtc3NoZC12ZXJzaW9uPgorICAgIDxhcGFjaGUtc3NoZC12ZXJzaW9uPjIuOC4wPC9hcGFjaGUtc3NoZC12ZXJzaW9uPgogICAgIDxqc2NoLXZlcnNpb24+MC4xLjU1PC9qc2NoLXZlcnNpb24+CiAgICAgPGp6bGliLXZlcnNpb24+MS4xLjE8L2p6bGliLXZlcnNpb24+CiAgICAgPGphdmFld2FoLXZlcnNpb24+MS4xLjEzPC9qYXZhZXdhaC12ZXJzaW9uPgpAQCAtMTYwLDcgKzE2MCw3IEBACiAgICAgPHRlc3QtZm9yay1jb3VudD4xQzwvdGVzdC1mb3JrLWNvdW50PgogICAgIDxhcmdzNGotdmVyc2lvbj4yLjMzPC9hcmdzNGotdmVyc2lvbj4KICAgICA8Y29tbW9ucy1jb21wcmVzcy12ZXJzaW9uPjEuMjE8L2NvbW1vbnMtY29tcHJlc3MtdmVyc2lvbj4KLSAgICA8b3NnaS1jb3JlLXZlcnNpb24+NC4zLjE8L29zZ2ktY29yZS12ZXJzaW9uPgorICAgIDxvc2dpLWNvcmUtdmVyc2lvbj42LjAuMDwvb3NnaS1jb3JlLXZlcnNpb24+CiAgICAgPHNlcnZsZXQtYXBpLXZlcnNpb24+NC4wLjA8L3NlcnZsZXQtYXBpLXZlcnNpb24+CiAgICAgPGpldHR5LXZlcnNpb24+MTAuMC42PC9qZXR0eS12ZXJzaW9uPgogICAgIDxqYXBpY21wLXZlcnNpb24+MC4xNS4zPC9qYXBpY21wLXZlcnNpb24+CkBAIC0xNjgsOCArMTY4LDggQEAKICAgICA8aHR0cGNvcmUtdmVyc2lvbj40LjQuMTQ8L2h0dHBjb3JlLXZlcnNpb24+CiAgICAgPHNsZjRqLXZlcnNpb24+MS43LjMwPC9zbGY0ai12ZXJzaW9uPgogICAgIDxtYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPjMuMy4xPC9tYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPgotICAgIDxnc29uLXZlcnNpb24+Mi44Ljg8L2dzb24tdmVyc2lvbj4KLSAgICA8Ym91bmN5Y2FzdGxlLXZlcnNpb24+MS42OTwvYm91bmN5Y2FzdGxlLXZlcnNpb24+CisgICAgPGdzb24tdmVyc2lvbj4yLjguOTwvZ3Nvbi12ZXJzaW9uPgorICAgIDxib3VuY3ljYXN0bGUtdmVyc2lvbj4xLjcwPC9ib3VuY3ljYXN0bGUtdmVyc2lvbj4KICAgICA8c3BvdGJ1Z3MtbWF2ZW4tcGx1Z2luLXZlcnNpb24+NC4zLjA8L3Nwb3RidWdzLW1hdmVuLXBsdWdpbi12ZXJzaW9uPgogICAgIDxtYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW4tdmVyc2lvbj4zLjEuMjwvbWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luLXZlcnNpb24+CiAgICAgPG1hdmVuLWp4ci1wbHVnaW4tdmVyc2lvbj4zLjEuMTwvbWF2ZW4tanhyLXBsdWdpbi12ZXJzaW9uPgpAQCAtMzQxLDcgKzM0MSw3IEBACiAgICAgICAgICAgICA8ZGVwZW5kZW5jeT48IS0tIGFkZCBzdXBwb3J0IGZvciBzc2gvc2NwIC0tPgogICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLndhZ29uPC9ncm91cElkPgogICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53YWdvbi1zc2g8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDx2ZXJzaW9uPjMuNC4zPC92ZXJzaW9uPgorICAgICAgICAgICAgICA8dmVyc2lvbj4zLjUuMTwvdmVyc2lvbj4KICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KICAgICAgICAgPC9wbHVnaW4+CkBAIC04ODYsNyArODg2LDcgQEAKICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamR0PC9ncm91cElkPgogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmVjajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjI3LjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My4yOC4wPC92ZXJzaW9uPgogICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KICAgICAgICAgICA8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL0JVSUxEIGIvdG9vbHMvQlVJTEQKaW5kZXggMTgyNjI0OS4uMWU2NzEwOCAxMDA2NDQKLS0tIGEvdG9vbHMvQlVJTEQKKysrIGIvdG9vbHMvQlVJTEQKQEAgLTEsMzQgKzEsMjggQEAKIGxvYWQoCiAgICAgIkBiYXplbF90b29scy8vdG9vbHMvamRrOmRlZmF1bHRfamF2YV90b29sY2hhaW4uYnpsIiwKLSAgICAiSkRLOV9KVk1fT1BUUyIsCiAgICAgImRlZmF1bHRfamF2YV90b29sY2hhaW4iLAogKQogbG9hZCgiQHJ1bGVzX2phdmEvL2phdmE6ZGVmcy5iemwiLCAiamF2YV9wYWNrYWdlX2NvbmZpZ3VyYXRpb24iKQogCi1KREsxMV9KVk1fT1BUUyA9IFsKLSAgICAiLS1hZGQtZXhwb3J0cz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5hcGk9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmNvZGU9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmNvbXA9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmZpbGU9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLm1haW49QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLnRyZWU9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1leHBvcnRzPWpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLnV0aWw9QUxMLVVOTkFNRUQiLAotICAgICItLWFkZC1vcGVucz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5maWxlPUFMTC1VTk5BTUVEIiwKLSAgICAiLS1wYXRjaC1tb2R1bGU9amF2YS5jb21waWxlcj0kKGxvY2F0aW9uIEBiYXplbF90b29scy8vdG9vbHMvamRrOmphdmFfY29tcGlsZXJfamFyKSIsCi0gICAgIi0tcGF0Y2gtbW9kdWxlPWpkay5jb21waWxlcj0kKGxvY2F0aW9uIEBiYXplbF90b29scy8vdG9vbHMvamRrOmpka19jb21waWxlcl9qYXIpIiwKLSAgICAiLS1hZGQtb3BlbnM9amF2YS5iYXNlL2phdmEubmlvPUFMTC1VTk5BTUVEIiwKLSAgICAiLS1hZGQtb3BlbnM9amF2YS5iYXNlL2phdmEubGFuZz1BTEwtVU5OQU1FRCIsCi1dCi0KIGRlZmF1bHRfamF2YV90b29sY2hhaW4oCi0gICAgbmFtZSA9ICJlcnJvcl9wcm9uZV93YXJuaW5nc190b29sY2hhaW4iLAotICAgIGJvb3RjbGFzc3BhdGggPSBbIkBiYXplbF90b29scy8vdG9vbHMvamRrOnBsYXRmb3JtY2xhc3NwYXRoLmphciJdLAotICAgIGp2bV9vcHRzID0gSkRLMTFfSlZNX09QVFMsCi0gICAgc291cmNlX3ZlcnNpb24gPSAiMTEiLAotICAgIHRhcmdldF92ZXJzaW9uID0gIjExIiwKKyAgICBuYW1lID0gImVycm9yX3Byb25lX3dhcm5pbmdzX3Rvb2xjaGFpbl9qYXZhMTEiLAogICAgIHBhY2thZ2VfY29uZmlndXJhdGlvbiA9IFsKICAgICAgICAgIjplcnJvcl9wcm9uZSIsCiAgICAgXSwKKyAgICBzb3VyY2VfdmVyc2lvbiA9ICIxMSIsCisgICAgdGFyZ2V0X3ZlcnNpb24gPSAiMTEiLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKykKKworZGVmYXVsdF9qYXZhX3Rvb2xjaGFpbigKKyAgICBuYW1lID0gImVycm9yX3Byb25lX3dhcm5pbmdzX3Rvb2xjaGFpbl9qYXZhMTciLAorICAgIGNvbmZpZ3VyYXRpb24gPSBkaWN0KCksCisgICAgamF2YV9ydW50aW1lID0gIkBiYXplbF90b29scy8vdG9vbHMvamRrOnJlbW90ZWpka18xNyIsCisgICAgcGFja2FnZV9jb25maWd1cmF0aW9uID0gWworICAgICAgICAiOmVycm9yX3Byb25lIiwKKyAgICBdLAorICAgIHNvdXJjZV92ZXJzaW9uID0gIjE3IiwKKyAgICB0YXJnZXRfdmVyc2lvbiA9ICIxNyIsCiAgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAogKQogCkBAIC0xMDgsMjAgKzEwMiwyNSBAQAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0Ly4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuYW50Ly4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS8uLi4iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LmdwZy5iYy50ZXN0Ly4uLiIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuZ3BnLmJjLy4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC8uLi4iLAotICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvLi4uIiwKKyAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5zc2gvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5qdW5pdC8uLi4iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L2h0dHAvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLy4uLiIsCiAgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnMvLi4uIiwKLSAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS8uLi4iLAotICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5hcGFjaGUvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guYXBhY2hlLmFnZW50Ly4uLiIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS50ZXN0Ly4uLiIsCisgICAgICAgICIvL29yZy5lY2xpcHNlLmpnaXQuc3NoLmFwYWNoZS8uLi4iLAorICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnNzaC5qc2NoLnRlc3QvLi4uIiwKKyAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5zc2guanNjaC8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvLi4uIiwKICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC51aS8uLi4iLAogICAgICAgICAiLy9vcmcuZWNsaXBzZS5qZ2l0Ly4uLiIsCmRpZmYgLS1naXQgYS90b29scy9iYXplbGlza192ZXJzaW9uLmJ6bCBiL3Rvb2xzL2JhemVsaXNrX3ZlcnNpb24uYnpsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIzZDEwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2JhemVsaXNrX3ZlcnNpb24uYnpsCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotX3RlbXBsYXRlID0gIiIiCi1sb2FkKCJAYmF6ZWxfc2t5bGliLy9saWI6dmVyc2lvbnMuYnpsIiwgInZlcnNpb25zIikKLQotZGVmIGNoZWNrX2JhemVsX3ZlcnNpb24oKToKLSAgdmVyc2lvbnMuY2hlY2sobWluaW11bV9iYXplbF92ZXJzaW9uID0gInt2ZXJzaW9ufSIpCi0iIiIuc3RyaXAoKQotCi1kZWYgX2ltcGwocmVwb3NpdG9yeV9jdHgpOgotICAgIHJlcG9zaXRvcnlfY3R4LnN5bWxpbmsoTGFiZWwoIkAvLzouYmF6ZWx2ZXJzaW9uIiksICIuYmF6ZWx2ZXJzaW9uIikKLSAgICBiYXplbHZlcnNpb24gPSByZXBvc2l0b3J5X2N0eC5yZWFkKCIuYmF6ZWx2ZXJzaW9uIikuc3RyaXAoKQotCi0gICAgcmVwb3NpdG9yeV9jdHguZmlsZSgiQlVJTEQiLCBleGVjdXRhYmxlID0gRmFsc2UpCi0KLSAgICByZXBvc2l0b3J5X2N0eC5maWxlKCJjaGVjay5iemwiLCBleGVjdXRhYmxlID0gRmFsc2UsIGNvbnRlbnQgPSBfdGVtcGxhdGUuZm9ybWF0KHZlcnNpb24gPSBiYXplbHZlcnNpb24pKQotCi1iYXplbGlza192ZXJzaW9uID0gcmVwb3NpdG9yeV9ydWxlKGltcGxlbWVudGF0aW9uID0gX2ltcGwpCmRpZmYgLS1naXQgYS90b29scy9yZW1vdGUtYmF6ZWxyYyBiL3Rvb2xzL3JlbW90ZS1iYXplbHJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Zjc5NGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZW1vdGUtYmF6ZWxyYwpAQCAtMCwwICsxLDY3IEBACisjIENvcHlyaWdodCAyMDIyIFRoZSBCYXplbCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGZyb20gcmVsZWFzZS9iYXplbHJjLnRwbCBhbmQgc2hvdWxkIG5vdCBiZQorIyBtb2RpZmllZCBkaXJlY3RseS4KKworIyBUaGlzIC5iYXplbHJjIGZpbGUgY29udGFpbnMgYWxsIG9mIHRoZSBmbGFncyByZXF1aXJlZCBmb3IgdGhlIHByb3ZpZGVkCisjIHRvb2xjaGFpbiB3aXRoIFJlbW90ZSBCdWlsZCBFeGVjdXRpb24uCisjCisjIFRoaXMgLmJhemVscmMgZmlsZSBhbHNvIGNvbnRhaW5zIGFsbCBvZiB0aGUgZmxhZ3MgcmVxdWlyZWQgZm9yIHRoZSBsb2NhbAorIyBkb2NrZXIgc2FuZGJveGluZy4KKworIyBEZXBlbmRpbmcgb24gaG93IG1hbnkgbWFjaGluZXMgYXJlIGluIHRoZSByZW1vdGUgZXhlY3V0aW9uIGluc3RhbmNlLCBzZXR0aW5nCisjIHRoaXMgaGlnaGVyIGNhbiBtYWtlIGJ1aWxkcyBmYXN0ZXIgYnkgYWxsb3dpbmcgbW9yZSBqb2JzIHRvIHJ1biBpbiBwYXJhbGxlbC4KKyMgU2V0dGluZyBpdCB0b28gaGlnaCBjYW4gcmVzdWx0IGluIGpvYnMgdGhhdCB0aW1lb3V0LCBob3dldmVyLCB3aGlsZSB3YWl0aW5nCisjIGZvciBhIHJlbW90ZSBtYWNoaW5lIHRvIGV4ZWN1dGUgdGhlbS4KK2J1aWxkOnJlbW90ZSAtLWpvYnM9MjAwCitidWlsZDpyZW1vdGUgLS1kaXNrX2NhY2hlPQorCisjIFNldCBzZXZlcmFsIGZsYWdzIHJlbGF0ZWQgdG8gc3BlY2lmeWluZyB0aGUgcGxhdGZvcm0sIHRvb2xjaGFpbiBhbmQgamF2YQorIyBwcm9wZXJ0aWVzLgorYnVpbGQ6cmVtb3RlIC0taG9zdF9qYXZhYmFzZT1AcmJlX2pkazExLy9qYXZhOmpkaworYnVpbGQ6cmVtb3RlIC0tamF2YWJhc2U9QHJiZV9qZGsxMS8vamF2YTpqZGsKK2J1aWxkOnJlbW90ZSAtLWNyb3NzdG9vbF90b3A9QHJiZV9qZGsxMS8vY2M6dG9vbGNoYWluCitidWlsZDpyZW1vdGUgLS1leHRyYV90b29sY2hhaW5zPUByYmVfamRrMTEvL2NvbmZpZzpjYy10b29sY2hhaW4KK2J1aWxkOnJlbW90ZSAtLWV4dHJhX2V4ZWN1dGlvbl9wbGF0Zm9ybXM9QHJiZV9qZGsxMS8vY29uZmlnOnBsYXRmb3JtCitidWlsZDpyZW1vdGUgLS1ob3N0X3BsYXRmb3JtPUByYmVfamRrMTEvL2NvbmZpZzpwbGF0Zm9ybQorYnVpbGQ6cmVtb3RlIC0tcGxhdGZvcm1zPUByYmVfamRrMTEvL2NvbmZpZzpwbGF0Zm9ybQorYnVpbGQ6cmVtb3RlIC0tYWN0aW9uX2Vudj1CQVpFTF9ET19OT1RfREVURUNUX0NQUF9UT09MQ0hBSU49MQorCisjIFNldCB2YXJpb3VzIHN0cmF0ZWdpZXMgc28gdGhhdCBhbGwgYWN0aW9ucyBleGVjdXRlIHJlbW90ZWx5LiBNaXhpbmcgcmVtb3RlCisjIGFuZCBsb2NhbCBleGVjdXRpb24gd2lsbCBsZWFkIHRvIGVycm9ycyB1bmxlc3MgdGhlIHRvb2xjaGFpbiBhbmQgcmVtb3RlCisjIG1hY2hpbmUgZXhhY3RseSBtYXRjaCB0aGUgaG9zdCBtYWNoaW5lLgorYnVpbGQ6cmVtb3RlIC0tZGVmaW5lPUVYRUNVVE9SPXJlbW90ZQorCisjIEVuYWJsZSB0aGUgcmVtb3RlIGNhY2hlIHNvIGFjdGlvbiByZXN1bHRzIGNhbiBiZSBzaGFyZWQgYWNyb3NzIG1hY2hpbmVzLAorIyBkZXZlbG9wZXJzLCBhbmQgd29ya3NwYWNlcy4KK2J1aWxkOnJlbW90ZSAtLXJlbW90ZV9jYWNoZT1yZW1vdGVidWlsZGV4ZWN1dGlvbi5nb29nbGVhcGlzLmNvbQorCisjIEVuYWJsZSByZW1vdGUgZXhlY3V0aW9uIHNvIGFjdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgcmVtb3RlIHN5c3RlbXMuCitidWlsZDpyZW1vdGUgLS1yZW1vdGVfZXhlY3V0b3I9cmVtb3RlYnVpbGRleGVjdXRpb24uZ29vZ2xlYXBpcy5jb20KKworIyBTZXQgYSBoaWdoZXIgdGltZW91dCB2YWx1ZSwganVzdCBpbiBjYXNlLgorYnVpbGQ6cmVtb3RlIC0tcmVtb3RlX3RpbWVvdXQ9MzYwMAorCisjIEVuYWJsZSBhdXRoZW50aWNhdGlvbi4gVGhpcyB3aWxsIHBpY2sgdXAgYXBwbGljYXRpb24gZGVmYXVsdCBjcmVkZW50aWFscyBieQorIyBkZWZhdWx0LiBZb3UgY2FuIHVzZSAtLWF1dGhfY3JlZGVudGlhbHM9c29tZV9maWxlLmpzb24gdG8gdXNlIGEgc2VydmljZQorIyBhY2NvdW50IGNyZWRlbnRpYWwgaW5zdGVhZC4KK2J1aWxkOnJlbW90ZSAtLWdvb2dsZV9kZWZhdWx0X2NyZWRlbnRpYWxzCisKKyMgVGhlIGZvbGxvd2luZyBmbGFncyBlbmFibGUgdGhlIHJlbW90ZSBjYWNoZSBzbyBhY3Rpb24gcmVzdWx0cyBjYW4gYmUgc2hhcmVkCisjIGFjcm9zcyBtYWNoaW5lcywgZGV2ZWxvcGVycywgYW5kIHdvcmtzcGFjZXMuCitidWlsZDpyZW1vdGUtY2FjaGUgLS1yZW1vdGVfY2FjaGU9cmVtb3RlYnVpbGRleGVjdXRpb24uZ29vZ2xlYXBpcy5jb20KK2J1aWxkOnJlbW90ZS1jYWNoZSAtLXRsc19lbmFibGVkPXRydWUKK2J1aWxkOnJlbW90ZS1jYWNoZSAtLXJlbW90ZV90aW1lb3V0PTM2MDAKK2J1aWxkOnJlbW90ZS1jYWNoZSAtLWF1dGhfZW5hYmxlZD10cnVlCg==